土日にいくつか、音声関係の技術確認を行いました。
音声認識(Voice Dictation)
UIDictationPhrase
iOS標準の音声認識エンジンを使うときのクラスなのですが、残念ながらこれが音声認識器なわけではありません。そういう説明がされている文書がなくて随分なやみました。ちなみに、Siriを呼び出しているわけではなく、iOSのアプリ上で、Siriにも使われているであろう「音声認識エンジン」が文字列入力に使えますが、それと連携する機能です。
このクラスは、認識された結果を受け取るときにアレイとして渡されてくるオブジェクトです。
使い方はすこしややこしいです。このオブジェクトを受け取るには「UITextInput」プロトコルを実装しなくてはならず、Delegateなどでは受け取れません。そこで、MyTextField等のクラスをUITextFieldから作り、「insertDictationResult」メソッドを実装します。そうすると、MyTextFieldを指でタップし、キーボードが現れたらマイクボタンをタップし、音声認識させ、「完了」をタップした瞬間に呼ばれます。このプロトコル・メソッドの引数「dictationResult」に配列として入って来るので、それを順次取り出し、textフィールドを取り出すと、認識結果が順次取り出せます。
- (void)insertDictationResult:(NSArray *)dictationResult { NSMutableString *text = [NSMutableString string]; for (UIDictationPhrase *phrase in dictationResult) { [text appendString:phrase.text]; } }
この方法では、テキストフィールドをタップ、キーボードが表示されたらマイクボタンをタップ、という操作が必要で、起動したままどんどん喋る、という使い方ができません。
UIDictationControllerという非公式なクラスがあるそうで、これを使うとアプリからタイマー起動などで自動的に音声認識をオンにすることが可能なようです。非公式なため、使ってしまうとアプリストアに載せられなくなりますが、インハウスでは可能なわけです。あとで試してみたいと思います。
Julius 4.3.1
オープンソースの音声認識エンジンです。
julius-4.3.1-win32bin.zip本体、DNN版Juliusディクテーション実行キット v4.3.1、Julius 記述文法音声認識キット v4.2といったものを順次ダウンロードして試してみました。
サンプルに用意されているものの問題かもしれませんが、「なにを話しかけても音声認識できる」ということを目指しているというよりは、ある程度狭い範囲の言葉を認識できるように用意されているようです。XML等で聞き取る言葉の語彙などを定義するようになっているので、多くの言葉を含んだスーパーセットを作れば可能なのかもしれないですが、重たくなる(リソースをたくさん喰う)のか、遅くなるのか、わかりません。
このため、実際に動かしてみてもぜんぜん認識してくれないように思いました。認識率は決して高くないように感じました。チューニングが必要なのだと思いますが、そうなるとiPhoneの認識エンジンなどのほうがずっと簡単で使い易いです。
発話(TTS : Text To Speech)
AI Talk 2 Plus
ずっと前にSOURCE NEXTでバーゲンやってたので購入してほうったらかしてたのでインストールして動かしてみました。子供、大人などの女性の声、男性の声などが選べ、読み上げ速度や声の高さなどが指定でき、便利です。ただ、ウィンドウを表示してマウス等で操作するアプリなので、エンジンとしては使えません。
AVSpeechSynthesizer
iOS標準のAPIで、AVFoundationから提供されています。Siriの発話エンジンはこれです。こちらは逆にアプリではなくAPIです。以前試したのですが、文書化してなかったので簡単に手順を書いておきます。
プロジェクトのGeneral > Linked Framework and Libraries に AVFoundation.framework を追加します。
AVSpeechSynthesizer* speechSynthesizer =[[AVSpeechSynthesizer alloc] init]; AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:speakingText]; utterance.rate = AVSpeechUtteranceMinimumSpeechRate; //読み上げる速さ utterance.pitchMultiplier = 1.0f; //声の高さ utterance.volume = 0.9f; //声の大きさ NSTimeInterval interval = 1; utterance.preUtteranceDelay = interval; //しゃべりだす前のインターバル utterance.postUtteranceDelay = interval; //しゃべり終わった後の次のメッセージをしゃべるまでのインターバル [speechSynthesizer speakUtterance:utterance];
たまに「ぷぷっ」と吹いてしまいそうな発音をします。