SlideShare a Scribd company logo
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

More Related Content

PDF
SiriKit iOS10
PPTX
PDF
第5回 デジタルガジェット祭り! スマートスピーカー特集(5)
PPTX
PDF
Spring social の基礎
PPTX
[デブサミ秋2015] 新卒入社エンジニアが 2年間fluentdを運用して学んだ事いろいろ
PDF
【20211027_toranoana.deno#2】とりあえずDenoを CloudRunで動かしてみる
PPTX
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
SiriKit iOS10
第5回 デジタルガジェット祭り! スマートスピーカー特集(5)
Spring social の基礎
[デブサミ秋2015] 新卒入社エンジニアが 2年間fluentdを運用して学んだ事いろいろ
【20211027_toranoana.deno#2】とりあえずDenoを CloudRunで動かしてみる
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)

Similar to Speech Framework (20)

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

More from Gaprot (13)

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

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