Skip to content

Instantly share code, notes, and snippets.

@kawaz
Last active December 12, 2023 07:36
Show Gist options
  • Save kawaz/ece40ab50d2ae0c1f888bb7c6f6cef72 to your computer and use it in GitHub Desktop.
Save kawaz/ece40ab50d2ae0c1f888bb7c6f6cef72 to your computer and use it in GitHub Desktop.
音声認識のテスト
const SpeechRecognition = window.SpeechRecognition || webkitSpeechRecognition
const SpeechGrammarList = window.SpeechGrammarList || webkitSpeechGrammarList
const recognition = new SpeechRecognition
const grammarList = new SpeechGrammarList()
{ // カスタムグラマーを追加するテスト(特別なキーワードがある時に使う感じ?何も追加しなくても動く)
const colors = [ 'aqua' , 'azure' , 'beige', 'bisque', 'black', 'blue', 'brown', 'chocolate', 'coral', 'crimson', 'cyan', 'fuchsia', 'ghostwhite', 'gold', 'goldenrod', 'gray', 'green', 'indigo', 'ivory', 'khaki', 'lavender', 'lime', 'linen', 'magenta', 'maroon', 'moccasin', 'navy', 'olive', 'orange', 'orchid', 'peru', 'pink', 'plum', 'purple', 'red', 'salmon', 'sienna', 'silver', 'snow', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'white', 'yellow'];
const colorsGrammer = '#JSGF V1.0; grammar colors; public <color> = ' + colors.join(' | ') + ' ;'
grammarList.addFromString(colorsGrammer);
}
recognition.grammars = grammarList
recognition.lang = 'ja-JP'
recognition.continuous = true //各認識の継続的な結果を返すか? default:false、これがfalseだと一つ目の確定結果イベントが発生した時点で聞き取りがstopされる。trueの場合は確定結果のresultイベントが継続的に何度も発生する。
recognition.interimResults = true //聞き取り途中の暫定的な結果を返すか? default:false、暫定結果無し{isFinal:true}な結果候補が来るのを待つと少し反応が悪いので、暫定と知りつつ結果を表示して、isFinal:true が来たら差し替えるという使い方が良いと思う。
recognition.maxAlternatives = 1 //結果候補の最大数(例えば「あいう」と言った時に[{transcript:"あいう",confidence:0.91},{transcript:"LINE",confidence:0.7},{transcript:"",confidence:0}] みたいなどう聞こえたかの候補が複数返ってくる。confidenceは自信度、一番自身があるやつ順になってるので基本的に最初の1個を採用すれば良く、それなら maxAlternatives は1で十分ということになる。
// とりあえず全部ログに出してみる
for(const t of `audioend audiostart end error nomatch result soundend soundstart speechend speechstart start`.split(/ /)){
recognition.addEventListener(t, e=>console.debug(e.type, {e}))
}
recognition.addEventListener("result", e=>{
[...e.results].forEach((r,ri)=>{
[...r].forEach((a,ai)=>{
if(a.confidence == 0) return
console.log(`results[${ri}][${ai}]`, r.isFinal, Math.floor(a.confidence*10), a.transcript)
})
})
})
recognition.start(); setTimeout(()=>{recognition.stop(),console.log("recognition stopped")}, 10_000)
@kawaz
Copy link
Author

kawaz commented Dec 28, 2021

@kawaz
Copy link
Author

kawaz commented Dec 12, 2023

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment