[iOS] 最新のSpeech Recognitionについて

# はじめに

iOS10から利用できるようになった音声認識API: [Speech Framework](https://developer.apple.com/documentation/speech)についてのWWDC2019でアップデートがあったので最新事情をサンプルとともにお届けします。

APIに関する導入の詳細は[iOSのSpeechフレームワークで音声認識 - 対応言語は58種類！ - Qiita](https://qiita.com/shu223/items/ca8e62803e83e396c177)をご覧ください。

# WWDC2019のセッション内容

WWDC2019のセッション[Advances in Speech Recognition - WWDC 2019 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2019/256/)の内容を見ていきます。

サマリーとしては、

1. macOSでのサポート
2. デバイス上で動作可能に
3. API強化のおかげで、豊富な音声分析ができるように

です。

# macOSでのサポート

このサポートは、MacのAppKitアプリとiPadアプリの両方で利用できます。 
iOSと同様に、50以上の言語がサポートされており、マイクにアクセスして音声を録音するには、ユーザーの承認が必要です。
また、ユーザーはSiriを有効にする必要があります。 

# デバイス上で動作可能に

表題の通りローカル環境のみで動作するようになりました。
ネットワーク通信の必要がなくなり、データがAppleに送信されないため、よりプライバシーにも配慮してアプリ開発をすることができます。
しかし、トレードオフとして

- 精度の差異
    - 継続的な学習を行なっているためサーバを通した方が優れている。
- リアルタイム性
    - ローカル実行すると遅延が少ない
- 制限
    - ネットワーク通信ではリクエスト数と音声の長さを制限
    - ローカルでは無制限
- 10の言語のみ対応
    - English, Spanish, Italian, Brazilian Portuguese, Russian, Turkish, Chinese


など、それぞれで問題点もあり、導入には要検討、と言ったところでしょうか。
特に、日本語対応していないのはかなり辛いですね。 :cry:

実装としては、`SFSpeechRecognizer`のインスタンスの`supportsOnDeviceRecognition`(iOS13+)でローカルに対応しているかを確認して、`SFSpeechAudioBufferRecognitionRequest`などのリクエストに生えた`requiresOnDeviceRecognition`をonにするだけです。


```swift
if speechRecognizer.supportsOnDeviceRecognition {
    recognitionRequest.requiresOnDeviceRecognition = true
} else {
    // do something    
}
```


[Advances in Speech Recognition - WWDC 2019 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2019/256/)の冒頭で手元で検証してみたところ下記のようになっており、トランスクリプトと比べてみました。再現環境にもよるかもしれませんが、どちらにしても正確さに欠けるかなと言う印象です。
サーバ通信の方は、最初の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.

| ローカル | サーバ通信 |
|:------------:|:------------:|
|![IMG_4885.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/8eceb4f0-c87a-f305-995c-bee49196d91a.png)|![IMG_4886.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69911/46ee09f4-0a36-96e6-8426-22db8d6b3a29.png)  |


# 豊富な音声分析について

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メソッドの結果からアクセスすることができます。


```swift

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](https://developer.apple.com/videos/play/wwdc2019/256/)の内容に沿ってお届けしました。

分析のJitterやShimmerといった専門領域に踏み込めなかったので、より詳細な解説はどなたかにお譲りしたいと思います。分かりやすい記事が読みたい...!
また、Voicingが何をあらわすかもまだよくわかっていないです。。

サンプルコードは[github.com/mtfum/SpeechSampler](https://github.com/mtfum/SpeechSampler)に置いておきますのでご覧くださいませ。

お読みいただきありがとうございました。

# 参考

- [Speech Recognition API - WWDC 2016 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2016/509/)
- [iOSのSpeechフレームワークで音声認識 - 対応言語は58種類！ - Qiita](https://qiita.com/shu223/items/ca8e62803e83e396c177)
- [Advances in Speech Recognition - WWDC 2019 - Videos - Apple Developer](https://developer.apple.com/videos/play/wwdc2019/256/)
- [Realtime Video Closed Captioning in SwiftUI - Better Programming - Medium](https://medium.com/better-programming/realtime-video-closed-captioning-in-swiftui-4022ba85c803)