Voice」をリリースしました。音声認識を使ってエバーノートへテキストを投稿できるアプリです。上記動画の音量が小さめですが実際に話しかけた内容が変換されていって最後に音声コマンドで送信されている様子がわかると思います。アプリの起動直後からすぐに音声認識が開始されます。中央の円は1分間のカウントダウンタイマーになっています(音声認識の上限が1分なため)。話しかけると音声が次々にテキストに変換されて行きます。(青い文字が認識途中で、黒文字は確定済)テキストへの変換が終わったら送信ボタンを押すだけです。後述する音声コマンドを使うとボタンを押さずに送信することもできます。使われている技術です。この音声認識は次のような特徴があります。言語設定は現在のものが使われますが、設定画面で他の言語に設定することも可能です。独自に音声コマンドというものを用意しています。音声認識の最後に特定のフレーズを言うことで、何らかのアクションを起こすことができます。このフレーズと仕組みを音声コマンドと呼んでいます。サポートされています。音声認識を確定させ、テキストを送信します。音声認識を確定して、テキスト編集状態になります。※コマンドの文字列自体はテキストには含まれません。音声コマンドとして認識されるとコマンドの文字列が緑色に光、ピピッと音がします。時々うまく認識されないことがあります。多くの場合はネットワークの一時的遅延(もしくはAppleの音声認識サービスの遅延)が原因だと思われます。外での移動中などネットワークが安定しない場合に多く発生する可能性があります。変換することができます。いう名前の付く複数のアプリシリーズの1つです。毎日1つのノートへまとまる点です。Voiceから投稿したノートに、写真や音声を追記していくといったことができます。複数のデバイスからの投稿も同様にまとめることができます(同一のエバーノートアカウントを使用した場合)。投稿が1つのノートにまとまっている例です。投稿は時刻で自動的にソートされます。API(SFSpeechRecognizer)が開発者に提供されるようになった。音声認識の機能自体は古くから存在したが、これまで開発者には公開されてこなかった。APIの発表があって、ついに一般のアプリに組み込めるチャンスがやってきた。このニュースを聞いた時から何かのアプリで音声入力インターフェイスを搭載したいと考えていた。Appleの音声認識技術はお世辞にも高いとは言えなかった。Siriに話しかけても誤変換が多くイライラした人も多かったと思う。Googleの音声認識の方が数段優れていた印象があって、小さな声で不明瞭に話しかけてもかなりの精度で変換してくれてた。Appleでも音声認識技術に進歩が見られてきて、以前と比べると明らかに認識精度が良くなった。誤変換は多いけれど前ほどではなくなっている。少なくとも適切な音量ではっきりと話しかければまずまずの高い精度でテキストに変換してくれるようになった(なんだこりゃ、ってのも未だにあるが...)。物足りない点はあるものの今回のアプリのような私的なメモ用途では徐々に実用的なレベルになってきたと感じる。Todayeeシリーズの一つとして今回開発することにしてみた。SFSpeechRecognizerサンプルコード(多くは元ネタがAppleのやつ)が出回っているので実装自体は難しくない。API自体もシンプル。入れるところが慣れないとわかりづらいくらいか。コールバックの処理はクロージャは使わずデリゲート(SFSpeechRecognitionTaskDelegate)を使った。そのほうが細かい制御ができるため。現状だとデフォルトで認識途中の文字列を返してくれるが(shouldReportPartialResults=true)、この時点ではまだ確定してなくて、話しかけていくうちに文脈に合わせて刻々と結果の文字列が変わっていく。十分な情報は入らない。クロージャでも同様の動き)。認識途中は話しかけた全内容が暫定的な文字列として渡ってくるだけ。開発者的には文節あるいは単語・句単位の情報が途中経過でも得られれば良いのだがそれはもらえない。毎回その時点での暫定の全文が渡される。この点がインタラクティブに音声認識を扱いたいアプリにはイマイチなところ。ユーザと対話的に細かい制御をするには文字列処理で対応する必要がある。ユーザが発音した内容を単語・句として取り扱うには前回の文字列と今回の文字列を比較してその差分を取る。APIは今のところ提供されていないので、誤変換があってもそれを認識途中にインタラクティブに直すことが難しい。現状でも音声認識中にユーザが直前の単語・句を取り消すボタンを押すといったことは実装可能だが、アプリ側でできるのは文字位置を使うくらいしか方法が無いので最終的な認識結果が当初と変わるとうまく扱えない(文字位置がずれてしまうので)。認識中にインタラクティブに手を加えて行くには、変換途中と変換確定後を通じて単語や句をトラッキングできる仕組みが必要。APIの応用範囲を限定的にしてしまっていると感じた。人間:間違ってるじゃん。あれ?というわけで、iOS11ではこのあたりの改良を希望。音声コマンドこれも音声認識APIを応用する上でやってみたかったことの一つ。実装してみると意外に楽しくてついついこの為に使ってしまったことも。単純なんだけどプチ未来感が感じられる機能。この音声コマンドの実装は、大げさな仕組みは無くて実現方法はいたって簡単。コマンド(単語:例えば「送信」)の前後の空白時間を測ることで認識している。t2秒の空白があったら「送信」をコマンドとして認識する。APIの利用が進むともっと良い方法が出てくると思う(期待)。あとがきVoiceを作ってからというもののエバーノートへの投稿が格段に増えた。何かあれば起動して音声でつぶやく。手入力から音声入力への転換は思った以上に投稿のスタイルを変えるかもしれない。アプリの入手は下記からどうぞ。Voice」をリリースしました。音声認識を使ってエバーノートへテキストを投稿できるアプリです。音量が小さめですが実際に話しかけた内容が変換されていって最後に音声コマンドで送信されている様子がわかると思います。アプリの起動直後からすぐに音声認識が開始されます。中央の円は1分間のカウントダウンタイマーになっています(音声認識の上限が1分なため)。話しかけると音声が次々にテキストに変換されて行きます。(青い文字が認識途中で、黒文字は確定済)テキストへの変換が終わったら送信ボタンを押すだけです。後述する音声コマンドを使うとボタンを押さずに送信することもできます。使われている技術です。この音声認識は次のような特徴があります。言語設定は現在のものが使われますが、設定画面で他の言語に設定することも可能です。独自に音声コマンドというものを用意しています。音声認識の最後に特定のフレーズを言うことで、何らかのアクションを起こすことができます。このフレーズと仕組みを音声コマンドと呼んでいます。サポートされています。音声認識を確定させ、テキストを送信します。音声認識を確定して、テキスト編集状態になります。※コマンドの文字列自体はテキストには含まれません。音声コマンドとして認識されるとコマンドの文字列が緑色に光、ピピッと音がします。時々うまく認識されないことがあります。多くの場合はネットワークの一時的遅延(もしくはAppleの音声認識サービスの遅延)が原因だと思われます。外での移動中などネットワークが安定しない場合に多く発生する可能性があります。変換することができます。いう名前の付く複数のアプリシリーズの1つです。毎日1つのノートへまとまる点です。Voiceから投稿したノートに、写真や音声を追記していくといったことができます。複数のデバイスからの投稿も同様にまとめることができます(同一のエバーノートアカウントを使用した場合)。投稿が1つのノートにまとまっている例です。投稿は時刻で自動的にソートされます。API(SFSpeechRecognizer)が開発者に提供されるようになった。音声認識の機能自体は古くから存在したが、これまで開発者には公開されてこなかった。APIの発表があって、ついに一般のアプリに組み込めるチャンスがやってきた。このニュースを聞いた時から何かのアプリで音声入力インターフェイスを搭載したいと考えていた。Appleの音声認識技術はお世辞にも高いとは言えなかった。Siriに話しかけても誤変換が多くイライラした人も多かったと思う。Googleの音声認識の方が数段優れていた印象があって、小さな声で不明瞭に話しかけてもかなりの精度で変換してくれてた。Appleでも音声認識技術に進歩が見られてきて、以前と比べると明らかに認識精度が良くなった。誤変換は多いけれど前ほどではなくなっている。少なくとも適切な音量ではっきりと話しかければまずまずの高い精度でテキストに変換してくれるようになった(なんだこりゃ、ってのも未だにあるが...)。物足りない点はあるものの今回のアプリのような私的なメモ用途では徐々に実用的なレベルになってきたと感じる。Todayeeシリーズの一つとして今回開発することにしてみた。SFSpeechRecognizerサンプルコード(多くは元ネタがAppleのやつ)が出回っているので実装自体は難しくない。API自体もシンプル。入れるところが慣れないとわかりづらいくらいか。コールバックの処理はクロージャは使わずデリゲート(SFSpeechRecognitionTaskDelegate)を使った。そのほうが細かい制御ができるため。現状だとデフォルトで認識途中の文字列を返してくれるが(shouldReportPartialResults=true)、この時点ではまだ確定してなくて、話しかけていくうちに文脈に合わせて刻々と結果の文字列が変わっていく。十分な情報は入らない。クロージャでも同様の動き)。認識途中は話しかけた全内容が暫定的な文字列として渡ってくるだけ。開発者的には文節あるいは単語・句単位の情報が途中経過でも得られれば良いのだがそれはもらえない。毎回その時点での暫定の全文が渡される。この点がインタラクティブに音声認識を扱いたいアプリにはイマイチなところ。ユーザと対話的に細かい制御をするには文字列処理で対応する必要がある。ユーザが発音した内容を単語・句として取り扱うには前回の文字列と今回の文字列を比較してその差分を取る。APIは今のところ提供されていないので、誤変換があってもそれを認識途中にインタラクティブに直すことが難しい。現状でも音声認識中にユーザが直前の単語・句を取り消すボタンを押すといったことは実装可能だが、アプリ側でできるのは文字位置を使うくらいしか方法が無いので最終的な認識結果が当初と変わるとうまく扱えない(文字位置がずれてしまうので)。認識中にインタラクティブに手を加えて行くには、変換途中と変換確定後を通じて単語や句をトラッキングできる仕組みが必要。APIの応用範囲を限定的にしてしまっていると感じた。人間:間違ってるじゃん。=3音声コマンドこれも音声認識APIを応用する上でやってみたかったことの一つ。実装してみると意外に楽しくてついついこの為に使ってしまったことも、単純なんだけどプチ未来感が感じられる機能。この音声コマンドの実装は、大げさな仕組みは無くて実現方法はいたって簡単。コマンド(単語:例えば「送信」)の前後の空白時間を測ることで認識している。t2秒の空白があったら「送信」をコマンドとして認識する。APIの利用が進むともっと良い方法が出てくると思う(期待)。あとがきVoiceを作ってからというもののエバーノートへの投稿が格段に増えた。何かあれば起動して音声でつぶやく。手入力から音声入力への転換は思った以上に投稿のスタイルを変えるかもしれない。アプリの入手は下記からどうぞ。