羽田
iOS10からSiriKitが開発者に開放され、開発者がSiriを利用できるようになりました。
”Hey Siri”から始まって、アプリに直接させたい作業を自由に指定して起動するなど出来るようになると期待しましたが、開放された機能は限定的で自由のないものでした。
・Siriからのアプリ呼び出し
・音声認識による文章起こし
今回は、音声認識による文章起こしについて解説します。
1. サンプルを確認する
SpeakToMe: Using Speech Recognition with AVAudioEngineというサンプルが公開されています。
SpeakToMeは音声解析した結果のテキストを表示するだけのサンプルです。
とりあえず実行。
1-1. プライバシー設定
起動直後、音声認識の許可ダイアログが表示されます。
とりあえずOK。
今度はマイクの許可ダイアログです。
ここで、ん?さっきの許可と違うのか?となった人は多いのではないでしょうか?
・音声認識の許可
Siriによる文章解析の許可を求めています。
・マイクの許可
マイクの入力を利用する許可を求めています。
うーん、これ音声認識使う時点でマイク使わないとかないのでは?と思ったのですが、入力元はマイク以外に音声ファイルなども指定できるのでした。
以下のクラスでオーディオファイルやURLを指定する事もできます。
SFSpeechURLRecognitionRequest
SFSpeechAudioBufferRecognitionRequest
1-2. 音声認識をしてみたら?
まずは
「こんにちは」
……”I don’t”
??? 日本語ダメかな?
「Hello」
……”Hello”
とりあえず、英語で無事認識。
しかし、最初の「こんにちは」がよく分からない文章に。
初期設定英語オンリーなのか?と、ソースの確認へ。
1-3. ロケールの設定と解析結果
ソースを確認すると初っ端から音声認識の初期化がありました。
言語設定があるので、とりあえず日本語にしてみましょう。
いつものローカライズからすると”en-US”の対義語は”ja-JP”でしょう。
「こんにちは」
……”こんにちは”
おぉ、無事に認識されました。
とりあえず日本語でOKなようなので、少し長めの文章を試します。
「雨にも負けず 風にも負けず そういうものに わたしはなりたい」
……”目にも負けず 風にも負けず そういう物に 私はなりたい”
惜しい。最初の雨は認識できませんでしたが、他は基本正解です。
漢字と平仮名はしょうがないでしょう。
また、ロケールは以下の関数で全種類取得できるようでした。
supportedLocales()
1-4. 解析候補
……”目にも負けず 風にも負けず そういう物に 私はなりたい”
文章は最終結果ですが、何やら途中で文章がウニョウニョしていました。
どうやら途中経過を取得するかどうかが設定で変わるようです。
先程の解析で最終的に表示されたものが、bestTranscriptionで一番信頼度の高い結果のようです。
transcriptionsは、その他の解析候補です。
その他の候補の中により近い結果がある可能性はありますが、デバッグ出力してもbestTranscriptionより良さそうな結果は出ていませんでした。
一部で流行った、イヤホンガンガン伝言ゲームのように段々聞き間違いが酷くなった結果が増えたようです。
伝言ゲームが流行ったくらいなので、音声認識だけでしか会話できないLINE的なものも可能性があるかもしれませんね。実用性はないでしょうが……。
2. まとめ
音声認識による文章起こしは、ある程度可能でした。
一発で完全な文章を書き起こすのは人間でも難しいと思うので、全体的に見れば好成績だったと思います。
普段の文章入力のように、候補をユーザーに選択させてより正しい結果を得たいと思うのですが実現するには問題があります。
Siriの文章解析には、候補の中からユーザーが正しい部分を選択して、それ以外をもう一度解析させるような仕組みが搭載されていません。つまり、音声入力をファイルに保存して特定の範囲を切り出し、再度解析に掛けるというのを開発者が実装する必要があります。
最後に今回の調査の中で解決しなかった課題を1つ。
最初の調査では、”こんにちは”が認識されませんでしたが、後日英語ロケールに変更した状態に戻しても何故か認識されるようになっていました。
WWDCのセッションでは、音声認識はユーザーに合わせた動作をするとの発言があったので、日本語の利用が多いと覚えられてしまったのではないかと予想しています。
ハダ
iOS/Android/Windows/Macなど各プラットフォームを手がけています。
前職は家庭用ゲームのプログラマでしたが、最近はスマホとPCでばかりゲームしています。