前回の続きです。
前回は、シナリオ的なことを書きました。
今回からプログラミングの要素が入ってきます。
さっそく問題。
マイクから入力された音声を、日本語として認識し、テキストに変換するにはどうしたらよいか?
答えは、「Web Speech APIを使う」です!
Web Speech API は、音声認識と音声合成の機能を持つ、ブラウザ標準APIです。
特に他のライブラリを持ってこなくても、ブラウザの機能をJavaScriptから呼び出すだけで使用できます。
音声認識機能は、クラウドベースのAPIが巨大ITプラットフォーマーを中心とした各社から提供されていますが、どれも時間課金方式なんですよね。なので、長時間使っていると、そのうちAPIやサーバーの使用量が発生します。
一方、ブラウザの機能として提供されているWeb Speech APIの場合、料金は発生しません。どれだけ使っても無料で使用することができます。一般ユーザーにはとてもやさしいです。
上記APIの説明ページでは、各ブラウザの対応状況が書かれています。
これによると、音声認識機能はPC上ではChromeとEdgeが対応していることが分かります。
ただし、実際に動かしてみると、Edge上では動作しません。英語なら対応しているのかもしれませんが、少なくとも日本語の音声認識をしたい場合は、Chrome一択になります。
なお、Web Speech API自体はまだドラフト版であり、上記表のアイコンにもあるとおり、まだ実験レベルの実装です。今後、動作や仕様が変わることもあるので、将来この記事を見て同じことを試そうとしても、動作することを保証できません。
Web Speech API を使ってコーディングしてみる
さっそく、Web Speech API を試してみます。
どの程度のものなのかを理解することは、とても大事です。
Visual Studio Code でもなんでもいいので、適当な開発環境かテキストエディタで上記のHTMLファイルを作成します。
ちなみに、開発環境の構築方法等については触れません(´・ω・`)
以下のVisual Studio の公開リポジトリにも置いときます。
⇒ test-web-speech-api.html
言語はJavaScriptになります。
SpeechRecognitionは、ブラウザの音声認識インターフェースです。
Chromeの場合は、webkitSpeechRecognitionがこれに当たります。
急ぎたいので細かい部分には触れません。
使い方については、こちらのドキュメントに書かれています。
認識終了時の、onaudioend, onsoundend, onspeechend の違いがわかりません・・・
同じタイミングでこれらのイベントが発火されるので、適当にどれか1つ使っとけばいいのかなー?みたいな(´・ω・`)
重要なのは、
・音声入力後に、認識結果がonresultで返ってくること
・event の中に、認識結果や確からしさの数値などが入っていること
・日本語音声認識は、lang プロパティに 'ja-JP' と指定すること
・認識の道中でも結果が欲しければ、interimResults プロパティを true にすること
・連続して認識したい場合は、continuous プロパティを true にすること
くらいです。
grammars プロパティを使うことで、音声コマンドとして使うこともできます。
リアルタイム認識においては、interimResults プロパティは false の方がいいです。
ためしてみると分かりますが、音声入力中にチャカチャカ推定結果が変わります。応答性は高いかもしれませんが、後段の音声合成の工程にどれを流すのかが定まりません。
そのため、最終的に上がってきた結果を流す方がよいということです。
また、認識アルゴリズム部分は分かりませんが、文章としてつじつまの合うような変換をしようとしているのか、認識にちょっと時間がかかります。ゆうてちょっとですけど。
continuous も、リアルタイム認識では false にしています。
認識結果が確定するたびにいったん認識作業を停止(stop)し、最初からスタート(start)しています。
continuous を true にすると、やはり文章のつじつまが合うような変換をするためか、時間が経過するにつれて認識結果が返ってくるまでに時間がかかったり、しばしば認識結果が返ってこない状態になります。
再スタートすると、直前の文章との整合性は取らなくなりますが、ほぼ結果を返してくれます。
onend イベントが発火すると、音声認識を再スタートするようにしています。
これでずっと音声認識ができます。
Web Speech API を試してみる
実装が終わったところでテストです。
実際にHTMLファイルをChromeで開いてみましょう。
file:///で動くかは分からないケド(´・ω・`)・・・動かないなら、node.jsを使ってみるとか、まずはあの手この手でやってみて。
PCにマイクを挿して、ブラウザを立ち上げます。
実行時にマイク使用の許可を求めてくるので、これを[許可]します。
なお、ウェブ上では https:// でないと、マイク使用がブラウザ側から拒否され、試すことができません。
ローカルなら、http:// でもよかった気がしますが、再接続のたびに許可を求めてきます。
ウェブ上で使うなら、https:// 限定になります。httpsの場合は、一度許可すれば再接続時に許可を求めてきません。(今後仕様が変わる場合があります。)
めんどい方は、以下に実験ページを置いたので、ここから試すこともできます。
※音声データを収集するものではありませんので、ご安心ください。
許可後、マイクに向かって「タクラマカン砂漠」と言うと・・・
認識してくれました!
使い終わったら閉じてあげてください。
いろいろマイクに向かって話してみると、どんな感じの音声認識かを理解できると思います。
まぁ、人間的な特徴は完全排除されますが、地声を晒すよりはマシだろうレベルだと分かると思います。
さて、次に音声合成です。
音声合成を無料でやるならば、Web Speech API の音声合成機能を使えばいいです。
ただそれだけです。
次のエントリーでは、Web Speech API の音声合成機能を使って、マイクから入力し、認識された日本語テキストを読み上げてみます。
ではでは(´・ω・`)