はじめに
iOS10から利用できるようになった音声認識API: Speech FrameworkについてのWWDC2019でアップデートがあったので最新事情をサンプルとともにお届けします。
APIに関する導入の詳細はiOSのSpeechフレームワークで音声認識 - 対応言語は58種類! - Qiitaをご覧ください。
WWDC2019のセッション内容
WWDC2019のセッションAdvances in Speech Recognition - WWDC 2019 - Videos - Apple Developerの内容を見ていきます。
サマリーとしては、
- macOSでのサポート
- デバイス上で動作可能に
- API強化のおかげで、豊富な音声分析ができるように
です。
macOSでのサポート
このサポートは、MacのAppKitアプリとiPadアプリの両方で利用できます。
iOSと同様に、50以上の言語がサポートされており、マイクにアクセスして音声を録音するには、ユーザーの承認が必要です。
また、ユーザーはSiriを有効にする必要があります。
デバイス上で動作可能に
表題の通りローカル環境のみで動作するようになりました。
ネットワーク通信の必要がなくなり、データがAppleに送信されないため、よりプライバシーにも配慮してアプリ開発をすることができます。
しかし、トレードオフとして
- 精度の差異
- 継続的な学習を行なっているためサーバを通した方が優れている。
- リアルタイム性
- ローカル実行すると遅延が少ない
- 制限
- ネットワーク通信ではリクエスト数と音声の長さを制限
- ローカルでは無制限
- 10の言語のみ対応
- English, Spanish, Italian, Brazilian Portuguese, Russian, Turkish, Chinese
など、それぞれで問題点もあり、導入には要検討、と言ったところでしょうか。
特に、日本語対応していないのはかなり辛いですね。
実装としては、SFSpeechRecognizer
のインスタンスのsupportsOnDeviceRecognition
(iOS13+)でローカルに対応しているかを確認して、SFSpeechAudioBufferRecognitionRequest
などのリクエストに生えたrequiresOnDeviceRecognition
をonにするだけです。
if speechRecognizer.supportsOnDeviceRecognition {
recognitionRequest.requiresOnDeviceRecognition = true
} else {
// do something
}
Advances in Speech Recognition - WWDC 2019 - Videos - Apple Developerの冒頭で手元で検証してみたところ下記のようになっており、トランスクリプトと比べてみました。再現環境にもよるかもしれませんが、どちらにしても正確さに欠けるかなと言う印象です。
サーバ通信の方は、最初のSEを無理やり言語化しようとしてしまったみたいですし。。
トランスクリプト
Hi. I'm Neha Agrawal, and I'm a software engineer working on speech recognition. In 2016, we introduced the Speech Recognition framework for developers to solve their speech recognition needs. For anyone who is new to this framework, I highly recommend watching this Speech Recognition API session by my colleague Henry Mason.
ローカル | サーバ通信 |
---|---|
豊富な音声分析について
Speech RecognitionがiOS10で提供が始まってからは、
- 書き起こし(Transcription)
- 代替解釈(Alternative interpretations)
- 信頼度(Confidence levels)
- タイミング情報(Timing information)
が結果として帰ってきていました。
iOS13からは新たに以下の結果も返してくれるようになりました。
- 速度(Speaking rate): 人が1分あたりの単語で話す速さ
- 平均休止時間(Average pause duration): 単語間の平均休止時間
- 音声解析機能(Voice Analytics features): より高度で専門的な解析
- Jitter: 音声のピッチの変化
- Shimmer: 音声の振幅の変化
- Pitch: トーンの高低
- Voicing: スピーチの中で発生した領域(?)
下記のように、recognitionTaskメソッドの結果からアクセスすることができます。
if let result = result {
let formattedString = result.bestTranscription.formattedString
let speakingRate = result.bestTranscription.speakingRate
let averagePauseDuration = result.bestTranscription.averagePauseDuration
for segment in result.bestTranscription.segments {
let jitter = segment.voiceAnalytics?.jitter.acousticFeatureValuePerFrame
let shimmer = segment.voiceAnalytics?.shimmer.acousticFeatureValuePerFrame
let pitch = segment.voiceAnalytics?.pitch.acousticFeatureValuePerFrame
let voicing = segment.voiceAnalytics?.voicing.acousticFeatureValuePerFrame
}
}
おわり
以上、Advances in Speech Recognition - WWDC 2019 - Videos - Apple Developerの内容に沿ってお届けしました。
分析のJitterやShimmerといった専門領域に踏み込めなかったので、より詳細な解説はどなたかにお譲りしたいと思います。分かりやすい記事が読みたい...!
また、Voicingが何をあらわすかもまだよくわかっていないです。。
サンプルコードはgithub.com/mtfum/SpeechSamplerに置いておきますのでご覧くださいませ。
お読みいただきありがとうございました。