はじめに
最近はもうOSの音声認識とかいろいろあるので、必要性が薄くなっているがChromeに付属するWebSpeechAPIで音声入力を作れないかテスト。
OS付属のものは基本的にカスタマイズができないので、将来カスタマイズをすることが目標となるが、現状どの程度のパフォーマンスなのかを調査。
漢字やカタカナに対応する日本語を変換するだけなら問題なさそう。ただし、数字にはかなり弱く、ブレが生じたり漢数字になったりする。
数字に関しては、チューニングでなんとかなるパターン数でない場合も大いにあると思うので、変換候補を増やして見つけにいく、あるいは、なんらかのライブラリでの変換が必要になりそうだ。
選択肢
まずは、ベンダーに頼まなきゃいけないレベルの従量課金じゃないSpeechToTextソリューションは(ア○○○スとか)は排除。個人や中小ベンチャーでやることが前提なので。すると有力なのは3つ(2つ)
(2020年2月くらい)
ソリューション名 | ストリーミング日本語対応 | 日本語対応 | 開発規模 | カスタマイズ |
---|---|---|---|---|
Google SpeechToText | ○ | ○ | 中〜大規模 (場合によっては要Storage連携) |
○ |
AWS Transcribe | X | ○ | 大規模 (要S3連携) |
○ |
Watson | ? | ○ | 大規模 | ○ |
Web Speech API | ○ | ○ | 小規模 | △ |
簡単に始めたかったので、Web Speech APIから試すことに。
他のサービスの利用用途はどちらかというと入力よりも、リアルタイム音声や録音したものの文字起こしなので、このような大規模になりがちなのでしょう
やったこと
<body>
<input id='text'>
<button id='start'>start</button>
<button id='stop'>stop</button>
</body>
<script>
SpeechRecognition = webkitSpeechRecognition || SpeechRecognition;
const recognition = new SpeechRecognition();
recognition.maxAlternatives=1;
recognition.lang = 'ja-JP';
input_form = document.getElementById('text');
start_button = document.getElementById('start');
stop_button = document.getElementById('stop');
start_button.addEventListener('click', function() {
recognition.onresult = (event) => {
console.log(event.results);
input_form.value = event.results[0][0].transcript;
}
recognition.start();
})
stop_button.addEventListener('click', function() {
recognition.stop();
})
</script>
もうどこでも手に入る系のコードで実験。
試した結果
アイウエオやソニー、ちょっとマイナーな企業名などは結構はいる
難しいと感じた文字列たち
発音 | 期待 | 結果 |
---|---|---|
いちまん | 10000 | 1万 |
じゅう | 10 | 純 渋 |
ひとり | 1人 | 一人 |
数字系は難しいようで、どちらかというと漢数字に直しがちなようです。
Grammerを入れることができるInterfaceも用意されていますが、これだけで全て算用数字に置き換えててくれるかというとわからない。
他のライブラリで変換処理だったりが必要そう。
複数のパターンマッチも表示できるためそれで出す
recognition.maxAlternatives
で候補を増やすことができるので10にして実験
上記の「いちまん」でテスト
欲しいものは4番目に手に入りそう。正規表現マッピングで数字しかないものを拾ってくればなんとかできそうだが、確実ではない。
上記の「じゅう」でもテスト
なんということだ。結果が変わったぞ。 環境や話者の期限や体調などにより差は生じるよう。でもこの場合でも、数字だけのものはなんとか取れそう。
結論
一般的な入力事項などであればWebSpeechAPIでも辞書登録なしでも、事足りそう。しかし、入力項目にバリデーションがかかったものの場合、例えば算用数字のみなど、「いくつか選択肢を出してそこから選ぶ。」や「他のライブラリと連携して変換する」といった処理が必要になりそう。
参考