はじめに
iOS10で音声認識APIのSpeech Frameworkが公開されました。WWDCで公開直後にそれを聞きつけた人からお仕事をもらう機会があり、音声認識APIとしてSpeech Frameworkを使った音声認識アプリを作っているので、その体験をもとにこの記事を書いてみます。Speech Frameworkを使ったアプリ開発に興味がある人向けの記事です。
どんなアプリを作ってる?
あまり詳しくはかけないのですが、要はアプリ利用者とアプリが対話するアプリです。あらかじめトークスクリプトを用意しておき、それに沿ってアプリが言葉を発します。アプリ利用者はそれに対して返答をし、その内容に応じてまたアプリが話して、の繰り返しです。
Speech Frameworkを使っていて困ったこと
ナレッジがまだまだ少ない
AppleのサンプルコードのSpeakToMeや、Qiitaなどである程度基本的な情報は落ちてます。
しかしそれをもう少し応用しようとすると、あれ、これはどうしたらいいのかな。という点が出てきて、そういったナレッジはまだまだ少ないです。
単語だけだと音声認識の精度が低い
きちんとある程度の長さのフレーズで話すとかなりの精度で認識してくれます。しかしフレーズが短かったり単語だけだとあまり精度が出ません。
当たり前といえば当たり前なのですが、前後のつながりからフレーズを推測してるので今の技術的には仕方ないのかなと。ですので、もし単語を音声認識で聞き取って、それをもとに何かしたい、といったことをやろうとすると精度がボトルネックになります。
アプリが発する言葉も認識してしまう
今回のような対話アプリですと、アプリ側も言葉を発します。アプリ側の言葉とアプリ利用者の声を区別して認識してほしいのですが現状Speech Frameworkではそれはできてません。少し調べてみると音声認識自体は近年大幅に精度が向上してきましたが、複数人の言葉が重なる会話はまだまだ困難があるようです。
本当はアプリが話してる時に少しかぶり気味でアプリ利用者が「いや、ちげぇよ!!」みたいなことをリアルタイムに行いたかったのですが、今回はやむを得ず順番に話すターン制にして回避しました。
普段使ってるSiriもそうで、Siriが話してるときはこちらは話せない仕様になってしまっています。今後の技術の発展に期待です。
一日に使える回数に制限がある
これはWWDC2016の時点で公開されていた情報ですが、Speech Frameworkを使った音声認識APIには利用回数に制限があります。端末ごとやアプリごとに制限があるようで明確にXXの間にXX回使ったらだめ、といったことは公開されていないようです。
確かに一日中開発をしていると、あれなんか何も認識しなくなった!となって、アプリごとの回数制限にひっかかったことが結構ありました。その場合はBundle Identifierを変更することで回避していました。
が、実際にアプリとして公開する場合、この制限が実際問題どこまでボトルネックになるのかはまだ実感できていません。わかる方いましたら教えてください。
話が終わったのか、途切れたのかの判断がアナログ
アプリ利用者「こんにちは、今日はいい天気ですね」
アプリ「はい、いい天気ですね」
などという会話を考えてみます。
実際の会話を考えるとテンポよくこの2つのフレーズが繋がってる必要があります。しかし、アプリ利用者がフレーズを言い終わったのか、ただ間をあけてるだけかはどう判断しましょう?
先程話したターン制ですと、アプリが返答を開始するタイミングが難しいです。
ここは、Speech Frameworkでは音声認識の中間結果を監視するする関数があるのでそれを活用します。具体的には音声認識を開始したらこの関数が頻繁に呼び出されます。ぎゃくに話が認識されてないときはその関数が呼ばれないです。ですのでこの関数が最後に呼び出されてから0.X秒たったら話が終わったと判断するようにしました。もっといい方法あれば教えていただけると助かります。そのうちAppleさんがいい関数を追加してくれることも祈ってます。
Speech Frameworkを使っていてよかったこと
無償で商用利用可
Open EarsやGoogle Speech API、docomo音声認識APIなどもありますが、日本語対応されていて無償で使えて商用利用できる、となるとSpeech Framework一択となります。
実装がそんなに難しくない
他のAPIとの比較はできてなきく、iOSエンジニアとしての他の機能の実装との比較になりますが、そんなに難しくないです。サンプルコードを見たり動かすだけで実際の利用レベルまではそこまで橋渡しはいらないです。実際にWWDCで公開直後でほとんどネットに情報がないときにでも、サンプルコードだけを見てどうにかなりました。(どっちかというとSwift3対応のほうが厄介でした汗)
iOS10から使えるようになったという話題性
技術的というよりはマーケティング的な観点になりますが、iOS10から公開されたSpeech Frameworkを使用する、というのはアプリを作る側としてもアプリを売り込む先としてもそれなりにひきになります。これはアプリというプロダクトそのものはもちろんですが、iOSエンジニアとしても最新技術をキャッチアップする、といった観点でもテンションが上がることかと思います。
参考にした情報
- iOSアプリでの音声認識機能実装方法まとめ
- サンプルコードSpeakToMe
- 【iOS 10】Speechフレームワークで音声認識 - 対応言語は58種類!
- 【iOS10】Speech Recognition API(音声認識API)の制約まとめ
- google先生
おわりに
iOS10から使えるようになったSpeech Frameworkを使ったアプリを開発してみての実体験をもとに、この記事を書かせていただきました。良かったことより困ったことのほうが質量ともに多く、まだまだ発展しがいがある技術領域だと思います。現時点でSpeech Frameworkを使うとどういうことになるか?という観点でお役に立てれば幸いです。