はじめに
技術的な内容については偉大なる先人が改めてこちらで書く必要がない程に詳しくまとめてくれているので、ここでは「この便利な技術をいかにして活用するか」について、自分なりの考えを述べていきたいと思います。
音声認識技術のこれまで
私自身が音声認識技術に触れたのは4年くらい前、仕事でAIを使ったテキスト化サービスに関わった時のことでした。
日本語しか使えない人間なのでよく分からないのですが、日本語の音声認識は英語等と比べて難しいと言われており、また日本という市場がそこまで重要視されていなかったのか、当時はAWSの音声テキスト化も日本語に対応していない等、かなーり後回しにされていた印象があります。
それからあらゆるクラウドベンダーがサービスを開始し、日本語対応し、精度についてもじわじわと上がってきています。
それまでは従量課金が多かったのですが、無料で使える音声認識が誕生したことは、「発展してるなー」という印象です。
音声認識の向き不向き
向き
PCやスマホに話しかける感覚で「ゆっくりはっきり」、更に一般的な言葉で話すとかなり高い精度で変換してくれるので、音声認識は最も適しているのは「特定の言葉をコマンドとして使う」ことだと個人的には考えています。
不向き
一方で、通話やライブ配信みたいな「人間に普通に話しかける感覚」で話したものを変換すると、中々いい結果が得られないものです。
音質や話し方にもよりますが、1~2年前の情報では音声認識の精度はCERで0.2以下(文字単位で80%以上正解)であれば優秀と言われていました。最近はもうちょい上がってるかもしれませんが、飛躍的な向上は現行のAIの考え方のままでは難しいのかなと思っています。
後、一般的でない固有名詞は「似た一般的な言葉」に誤変換される傾向にあります。これは人間が「知らない単語を聞いたときに似た知っている言葉と勘違いする」のと似ていますね。
多くの音声認識システムには、この欠点を補うために「辞書登録」という特定の単語や語彙、文法などを登録する機能があるのですが、単語登録しても「似た音の一般的な言葉」に結果が引っ張られてしまったり、最近は各社こういったチューニングへの依存を低下させることで、「チューニングしなくても使える音声認識」を目指している傾向にあります。
以上のことから、会話の文字起こしや文章の生成(特に証拠の記録のような「間違いが許されないもの」)、タイピングの代替手段に使えるレベルには至っていないと考えています。
以上のことから
Web系のエンジニアとしては、「進め」でブラウザバックをしたり、画面名を言うことで特定の画面に遷移したり(認識しやすい名前にする必要はありますが)、「動け」「止まれ」でオーディオやビデオを再生・停止したりすることで、手を使わずにPCを操作するような方法が現実的かと考えています。
ポエムだけで終わるのはアレなので、最後に上記を元に声でブラウザ上のオーディオやビデオを動かすコードを作成してみます。
<script>
SpeechRecognition = webkitSpeechRecognition || SpeechRecognition;
const recognition = new SpeechRecognition();
recognition.lang = 'ja-JP';
recognition.continuous = true;
recognition.onresult = (event) => {
// 最新の変換結果を取得
var text = event.results[event.results.length-1][0].transcript;
console.log(text);
// 対象のvideoまたはaudioエレメントを取得
var media = null;
if(document.getElementsByTagName("audio").length > 0){
media = document.getElementsByTagName("audio")[0];
}
if(document.getElementsByTagName("video").length > 0){
media = document.getElementsByTagName("video")[0];
}
if(!media){
return;
}
// 「進め」「戻れ」は数字が指定されていればその秒数、なければ10動かす
var offset = parseInt(text) ? parseInt(text) : 10;
if(text.indexOf('進め') !== -1){
media.currentTime = media.currentTime + offset;
}else if(text.indexOf('戻れ') !== -1){
media.currentTime = media.currentTime - offset;
}else if(text.indexOf('止まれ') !== -1){
media.pause();
}else if(text.indexOf('動け') !== -1){
// autoplayのないaudio/videoタグだと動かないかも
media.play();
}
}
recognition.onend = (event) => {
// 数分で勝手に停止する。回避方法が見つからなかったので、自動で再開させる
console.log(event);
recognition.start();
}
recognition.start();
</script>