SlideShare une entreprise Scribd logo
1  sur  40
Télécharger pour lire hors ligne
Copyright © Up-frontier, Inc. All rights reserved.
Speech Framework
1
Copyright © Up-frontier, Inc. All rights reserved.
アジェンダ
• Speech Framework とは
• 使い⽅
• 使いどころ
2
Copyright © Up-frontier, Inc. All rights reserved.
アジェンダ
• Speech Framework とは
• 使い⽅
• 使いどころ
3
Copyright © Up-frontier, Inc. All rights reserved.
…の前に、まずは
Keyboard Dictation
4
Copyright © Up-frontier, Inc. All rights reserved.
Keyboard Dictation
• iPhone 4S からキーボードに内蔵
されていた、⾳声⼊⼒機能
• OS の機能であって、

アプリの機能ではない
• 設定 → ⼀般 → 

キーボード → ⾳声⼊⼒
5
Copyright © Up-frontier, Inc. All rights reserved.
Keyboard Dictation
• iPhone 4S からキーボードに内蔵
されていた、⾳声⼊⼒機能
• OS の機能であって、

アプリの機能ではない
• 設定 → ⼀般 → 

キーボード → ⾳声⼊⼒
6
これ
Copyright © Up-frontier, Inc. All rights reserved.
Keyboard Dictation
• 有効無効の設定を知るための API がない
• 必ずキーボードとセット
• キーボード⾔語に依存
7
Copyright © Up-frontier, Inc. All rights reserved.
…では改めて
Speech Framework
8
Copyright © Up-frontier, Inc. All rights reserved.
Speech Framework
• 平たく⾔うと、⾳声認識APIです
• 受け取った⾳声をテキストとして扱う
• 認識の部分は Siriと同じエンジン を利⽤
• リッチな結果(ベストと候補、確度など)
• ⾳声ファイルからの⼊⼒も可能
9
Copyright © Up-frontier, Inc. All rights reserved.
• マイクを利⽤したリアルタイム⾳声
• wavやmp3などの⾳声データでもOK
10
Copyright © Up-frontier, Inc. All rights reserved.
注意点
• 基本ネットワーク接続が必須
• リクエストに制限あり (アプリごと、端末ごと)
• 機密情報は NG (password, health, financial)
• ユーザに親切な UI を⼼がける

- 録⾳中、認識途中の結果、最終的な認識結果
11
Copyright © Up-frontier, Inc. All rights reserved.
アジェンダ
• Speech Framework とは
• 使い⽅
• 使いどころ
12
Copyright © Up-frontier, Inc. All rights reserved.
①
ユーザの許可を得る
13
Copyright © Up-frontier, Inc. All rights reserved.
ユーザ許可
SFSpeechRecognizer.requestAuthorization { status in
switch status {
case .authorized:
case .denied:
case .notDetermined:
case .restricted:
}
}
14
Copyright © Up-frontier, Inc. All rights reserved.
ユーザ許可
SFSpeechRecognizer.requestAuthorization { status in
switch status {
case .authorized:
case .denied:
case .notDetermined:
case .restricted:
}
}
15
よくある権限ステータス
(位置情報アクセスなど)
Copyright © Up-frontier, Inc. All rights reserved.
ユーザ許可
SFSpeechRecognizer.requestAuthorization { status in
switch status {
case .authorized:
case .denied:
case .notDetermined:
case .restricted:
}
}
16
デバイス判断で NG
前述の”リクエスト制限”によるもの?
Copyright © Up-frontier, Inc. All rights reserved.
17
Copyright © Up-frontier, Inc. All rights reserved.
18
Copyright © Up-frontier, Inc. All rights reserved.
Info.plist
<key>NSSpeechRecognitionUsageDescription</key>
<string>SpeechFramework の使⽤⽬的</string>
19
Copyright © Up-frontier, Inc. All rights reserved.
Info.plist
<key>NSSpeechRecognitionUsageDescription</key>
<string>SpeechFramework の使⽤⽬的</string>
20
ローカライズが必要な場合は、
InfoPlist.string を利⽤しましょう。
(plistじゃ視認性も悪いしね)
Copyright © Up-frontier, Inc. All rights reserved.
②
リクエストを作る
21
Copyright © Up-frontier, Inc. All rights reserved.
リクエスト
guard let audioURL = R.file.speechMp3() else {
print("Could not get file URL!")
return
}
let request = SFSpeechURLRecognitionRequest(url: audioURL)
22
Copyright © Up-frontier, Inc. All rights reserved.
リクエスト
guard let audioURL = R.file.speechMp3() else {
print("Could not get file URL!")
return
}
let request = SFSpeechURLRecognitionRequest(url: audioURL)
23
対象のファイルのURLを⽣成して
Copyright © Up-frontier, Inc. All rights reserved.
リクエスト
guard let audioURL = R.file.speechMp3() else {
print("Could not get file URL!")
return
}
let request = SFSpeechURLRecognitionRequest(url: audioURL)
24
リクエストを⽣成する
Copyright © Up-frontier, Inc. All rights reserved.
③
タスクを作って実⾏
25
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: "ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
26
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: "ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
27
ロケールを指定して
SFSpeechRecognizer を⽣成
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: "ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
28
en-US を指定すれば、⽶英語
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: “ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
29
事前に⽣成した request を指定して
タスクメソッドを実⾏する。
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: “ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
30
結果はクロージャで受け取る
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: “ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
31
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: “ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
32
1番確度の⾼いものを
いい感じのフォーマットで受け取る
Copyright © Up-frontier, Inc. All rights reserved.
タスク
let recognizer = SFSpeechRecognizer(
locale: Locale(identifier: “ja-JP"))
recognizer?.recognitionTask(with: request) { result, error in
guard let result = result else {
print("Error on recognition task: (error)")
return
}
self.textView.text = result

.bestTranscription.formattedString
print(result.transcriptions)
}
33
bestTranscription
導出過程の候補はここにある
Copyright © Up-frontier, Inc. All rights reserved.
使い⽅まとめ
1. ユーザに許可を求めて
2. リクエストを作って
3. SFSpeechRecognizer にタスクとしてお願い
34
Copyright © Up-frontier, Inc. All rights reserved.
アジェンダ
• Speech Framework とは
• 使い⽅
• 使いどころ
35
Copyright © Up-frontier, Inc. All rights reserved.
⾶びつく前に
• Keyboard Dictation で実現できないかを

まず考える
• リクエスト制限などを考えると、

コアの機能には持ってきにくい

- 具体的な制限回数については明記なし
36
Copyright © Up-frontier, Inc. All rights reserved.
考えられるユースケース
• 「チーズ」という⾔葉に反応して、

⾃動でシャッターを切るカメラ (WWDCビデ
オ)
• 外国語の発⾳練習
• ⾃作キーボードアプリに⾳声⼊⼒機能を実装
• Podcast やボイスレコーダーのテキスト起こし
37
Copyright © Up-frontier, Inc. All rights reserved.
考えられるユースケース
Speech Framework を利⽤した、英単語の発⾳練習アプリ
38
Copyright © Up-frontier, Inc. All rights reserved.
考えられるユースケース
Speech Framework を利⽤した、英単語の発⾳練習アプリ
39
Copyright © Up-frontier, Inc. All rights reserved.
まとめ
• 本家 Apple 製の⾳声認識API
• 解析エンジンは Siri と同様のもの
• マイク⼊⼒とファイル⼊⼒の両⽅で利⽤可能
• 利⽤回数や利⽤時間に制限がある
40

Contenu connexe

Similaire à Speech Framework

Terraform with Bitbucket pipeline
Terraform with Bitbucket pipelineTerraform with Bitbucket pipeline
Terraform with Bitbucket pipelineMasatomo Ito
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡心 谷本
 
決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニーTokuhiro Eto
 
Oracle Application Express Plug-inをつかってみよう
Oracle Application Express Plug-inをつかってみようOracle Application Express Plug-inをつかってみよう
Oracle Application Express Plug-inをつかってみようutatu
 
Nifty cloud jtf2014ハンズオン資料
Nifty cloud jtf2014ハンズオン資料Nifty cloud jtf2014ハンズオン資料
Nifty cloud jtf2014ハンズオン資料亮介 山口
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーAyumu Kawaguchi
 
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...David Buck
 
1.29.user,user,user
1.29.user,user,user1.29.user,user,user
1.29.user,user,userTonny Xu
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) akira6592
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)akira6592
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記心 谷本
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐CODE BLUE
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as codeYosuke Hiraishi
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”Drecom Co., Ltd.
 

Similaire à Speech Framework (20)

決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu決済金融から始めるデータドリブンカンパニー #yjmu
決済金融から始めるデータドリブンカンパニー #yjmu
 
Terraform with Bitbucket pipeline
Terraform with Bitbucket pipelineTerraform with Bitbucket pipeline
Terraform with Bitbucket pipeline
 
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
実例Javaトラブルシューティング! 〜稼働中のシステムを立て直した半年間の軌跡
 
決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー決済金融から始めるデータドリブンカンパニー
決済金融から始めるデータドリブンカンパニー
 
Oracle Application Express Plug-inをつかってみよう
Oracle Application Express Plug-inをつかってみようOracle Application Express Plug-inをつかってみよう
Oracle Application Express Plug-inをつかってみよう
 
Nifty cloud jtf2014ハンズオン資料
Nifty cloud jtf2014ハンズオン資料Nifty cloud jtf2014ハンズオン資料
Nifty cloud jtf2014ハンズオン資料
 
Ec cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナーEc cube開発合宿 プラグインセミナー
Ec cube開発合宿 プラグインセミナー
 
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
JDK Mission Control: Where We Are, Where We Are Going [Groundbreakers APAC 20...
 
FFR EXCALOC
FFR EXCALOCFFR EXCALOC
FFR EXCALOC
 
1.29.user,user,user
1.29.user,user,user1.29.user,user,user
1.29.user,user,user
 
Lithium Labo #1
Lithium Labo #1Lithium Labo #1
Lithium Labo #1
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催) ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~(2017/08/18追加開催)
 
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
ネットワーク自動化、なに使う? ~自動化ツール紹介~ (2017/07/21開催)
 
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
人気番組との戦い! Javaシステムのパフォーマンスチューニング奮闘記
 
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
攻撃者の行動を追跡せよ -行動パターンに基づく横断的侵害の把握と調査- by 朝長 秀誠, 六田 佳祐
 
1MB
1MB1MB
1MB
 
BBBBB
BBBBBBBBBB
BBBBB
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
 
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_cccSpring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
 
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
[CEDEC2014]モバイルゲームにおける社内基盤開発と“実録”
 

Plus de Gaprot

AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!Gaprot
 
Unity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめUnity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめGaprot
 
1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書Gaprot
 
Proactive Suggestions
Proactive SuggestionsProactive Suggestions
Proactive SuggestionsGaprot
 
New Notification API in iOS 10
New Notification API in iOS 10New Notification API in iOS 10
New Notification API in iOS 10Gaprot
 
iOS 10 new Camera
iOS 10 new CameraiOS 10 new Camera
iOS 10 new CameraGaprot
 
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるHTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるGaprot
 
Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Gaprot
 
GoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGaprot
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたGaprot
 
Salmon Hunt
Salmon HuntSalmon Hunt
Salmon HuntGaprot
 
SONY Camera Remote API
SONY Camera Remote APISONY Camera Remote API
SONY Camera Remote APIGaprot
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!Gaprot
 

Plus de Gaprot (13)

AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!AR開発高速化!「CFA」作りました!
AR開発高速化!「CFA」作りました!
 
Unity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめUnity + iOS/Android VR ことはじめ
Unity + iOS/Android VR ことはじめ
 
1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書1201 ギャップロ軍団企画書
1201 ギャップロ軍団企画書
 
Proactive Suggestions
Proactive SuggestionsProactive Suggestions
Proactive Suggestions
 
New Notification API in iOS 10
New Notification API in iOS 10New Notification API in iOS 10
New Notification API in iOS 10
 
iOS 10 new Camera
iOS 10 new CameraiOS 10 new Camera
iOS 10 new Camera
 
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させるHTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
HTML5 + JavaScriptでDRMつきMPEG-DASHを再生させる
 
Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料Aiマッシュアップ委員会 仕様説明資料
Aiマッシュアップ委員会 仕様説明資料
 
GoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターンGoF のデザインパターンじゃないけど、よくあるパターン
GoF のデザインパターンじゃないけど、よくあるパターン
 
Java の Collection 関連について整理してみました
Java の Collection 関連について整理してみましたJava の Collection 関連について整理してみました
Java の Collection 関連について整理してみました
 
Salmon Hunt
Salmon HuntSalmon Hunt
Salmon Hunt
 
SONY Camera Remote API
SONY Camera Remote APISONY Camera Remote API
SONY Camera Remote API
 
「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!「バグあるある」と「仕様変更あるある」一挙大放出SP!
「バグあるある」と「仕様変更あるある」一挙大放出SP!
 

Speech Framework

  • 1. Copyright © Up-frontier, Inc. All rights reserved. Speech Framework 1
  • 2. Copyright © Up-frontier, Inc. All rights reserved. アジェンダ • Speech Framework とは • 使い⽅ • 使いどころ 2
  • 3. Copyright © Up-frontier, Inc. All rights reserved. アジェンダ • Speech Framework とは • 使い⽅ • 使いどころ 3
  • 4. Copyright © Up-frontier, Inc. All rights reserved. …の前に、まずは Keyboard Dictation 4
  • 5. Copyright © Up-frontier, Inc. All rights reserved. Keyboard Dictation • iPhone 4S からキーボードに内蔵 されていた、⾳声⼊⼒機能 • OS の機能であって、
 アプリの機能ではない • 設定 → ⼀般 → 
 キーボード → ⾳声⼊⼒ 5
  • 6. Copyright © Up-frontier, Inc. All rights reserved. Keyboard Dictation • iPhone 4S からキーボードに内蔵 されていた、⾳声⼊⼒機能 • OS の機能であって、
 アプリの機能ではない • 設定 → ⼀般 → 
 キーボード → ⾳声⼊⼒ 6 これ
  • 7. Copyright © Up-frontier, Inc. All rights reserved. Keyboard Dictation • 有効無効の設定を知るための API がない • 必ずキーボードとセット • キーボード⾔語に依存 7
  • 8. Copyright © Up-frontier, Inc. All rights reserved. …では改めて Speech Framework 8
  • 9. Copyright © Up-frontier, Inc. All rights reserved. Speech Framework • 平たく⾔うと、⾳声認識APIです • 受け取った⾳声をテキストとして扱う • 認識の部分は Siriと同じエンジン を利⽤ • リッチな結果(ベストと候補、確度など) • ⾳声ファイルからの⼊⼒も可能 9
  • 10. Copyright © Up-frontier, Inc. All rights reserved. • マイクを利⽤したリアルタイム⾳声 • wavやmp3などの⾳声データでもOK 10
  • 11. Copyright © Up-frontier, Inc. All rights reserved. 注意点 • 基本ネットワーク接続が必須 • リクエストに制限あり (アプリごと、端末ごと) • 機密情報は NG (password, health, financial) • ユーザに親切な UI を⼼がける
 - 録⾳中、認識途中の結果、最終的な認識結果 11
  • 12. Copyright © Up-frontier, Inc. All rights reserved. アジェンダ • Speech Framework とは • 使い⽅ • 使いどころ 12
  • 13. Copyright © Up-frontier, Inc. All rights reserved. ① ユーザの許可を得る 13
  • 14. Copyright © Up-frontier, Inc. All rights reserved. ユーザ許可 SFSpeechRecognizer.requestAuthorization { status in switch status { case .authorized: case .denied: case .notDetermined: case .restricted: } } 14
  • 15. Copyright © Up-frontier, Inc. All rights reserved. ユーザ許可 SFSpeechRecognizer.requestAuthorization { status in switch status { case .authorized: case .denied: case .notDetermined: case .restricted: } } 15 よくある権限ステータス (位置情報アクセスなど)
  • 16. Copyright © Up-frontier, Inc. All rights reserved. ユーザ許可 SFSpeechRecognizer.requestAuthorization { status in switch status { case .authorized: case .denied: case .notDetermined: case .restricted: } } 16 デバイス判断で NG 前述の”リクエスト制限”によるもの?
  • 17. Copyright © Up-frontier, Inc. All rights reserved. 17
  • 18. Copyright © Up-frontier, Inc. All rights reserved. 18
  • 19. Copyright © Up-frontier, Inc. All rights reserved. Info.plist <key>NSSpeechRecognitionUsageDescription</key> <string>SpeechFramework の使⽤⽬的</string> 19
  • 20. Copyright © Up-frontier, Inc. All rights reserved. Info.plist <key>NSSpeechRecognitionUsageDescription</key> <string>SpeechFramework の使⽤⽬的</string> 20 ローカライズが必要な場合は、 InfoPlist.string を利⽤しましょう。 (plistじゃ視認性も悪いしね)
  • 21. Copyright © Up-frontier, Inc. All rights reserved. ② リクエストを作る 21
  • 22. Copyright © Up-frontier, Inc. All rights reserved. リクエスト guard let audioURL = R.file.speechMp3() else { print("Could not get file URL!") return } let request = SFSpeechURLRecognitionRequest(url: audioURL) 22
  • 23. Copyright © Up-frontier, Inc. All rights reserved. リクエスト guard let audioURL = R.file.speechMp3() else { print("Could not get file URL!") return } let request = SFSpeechURLRecognitionRequest(url: audioURL) 23 対象のファイルのURLを⽣成して
  • 24. Copyright © Up-frontier, Inc. All rights reserved. リクエスト guard let audioURL = R.file.speechMp3() else { print("Could not get file URL!") return } let request = SFSpeechURLRecognitionRequest(url: audioURL) 24 リクエストを⽣成する
  • 25. Copyright © Up-frontier, Inc. All rights reserved. ③ タスクを作って実⾏ 25
  • 26. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: "ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 26
  • 27. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: "ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 27 ロケールを指定して SFSpeechRecognizer を⽣成
  • 28. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: "ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 28 en-US を指定すれば、⽶英語
  • 29. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: “ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 29 事前に⽣成した request を指定して タスクメソッドを実⾏する。
  • 30. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: “ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 30 結果はクロージャで受け取る
  • 31. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: “ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 31
  • 32. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: “ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 32 1番確度の⾼いものを いい感じのフォーマットで受け取る
  • 33. Copyright © Up-frontier, Inc. All rights reserved. タスク let recognizer = SFSpeechRecognizer( locale: Locale(identifier: “ja-JP")) recognizer?.recognitionTask(with: request) { result, error in guard let result = result else { print("Error on recognition task: (error)") return } self.textView.text = result
 .bestTranscription.formattedString print(result.transcriptions) } 33 bestTranscription 導出過程の候補はここにある
  • 34. Copyright © Up-frontier, Inc. All rights reserved. 使い⽅まとめ 1. ユーザに許可を求めて 2. リクエストを作って 3. SFSpeechRecognizer にタスクとしてお願い 34
  • 35. Copyright © Up-frontier, Inc. All rights reserved. アジェンダ • Speech Framework とは • 使い⽅ • 使いどころ 35
  • 36. Copyright © Up-frontier, Inc. All rights reserved. ⾶びつく前に • Keyboard Dictation で実現できないかを
 まず考える • リクエスト制限などを考えると、
 コアの機能には持ってきにくい
 - 具体的な制限回数については明記なし 36
  • 37. Copyright © Up-frontier, Inc. All rights reserved. 考えられるユースケース • 「チーズ」という⾔葉に反応して、
 ⾃動でシャッターを切るカメラ (WWDCビデ オ) • 外国語の発⾳練習 • ⾃作キーボードアプリに⾳声⼊⼒機能を実装 • Podcast やボイスレコーダーのテキスト起こし 37
  • 38. Copyright © Up-frontier, Inc. All rights reserved. 考えられるユースケース Speech Framework を利⽤した、英単語の発⾳練習アプリ 38
  • 39. Copyright © Up-frontier, Inc. All rights reserved. 考えられるユースケース Speech Framework を利⽤した、英単語の発⾳練習アプリ 39
  • 40. Copyright © Up-frontier, Inc. All rights reserved. まとめ • 本家 Apple 製の⾳声認識API • 解析エンジンは Siri と同様のもの • マイク⼊⼒とファイル⼊⼒の両⽅で利⽤可能 • 利⽤回数や利⽤時間に制限がある 40