Closed5
SpeechSynthesis備忘録
SpeechSynthesisの扱い方がよく分からなかったのでまとめ
自作テストサイト音声対応しているか
const canUseSpeechSynthesisText =
"speechSynthesis" in window
? "このブラウザは音声合成に対応しています"
: "このブラウザは音声合成に対応していません";
喋らせる関数
const uttr = new SpeechSynthesisUtterance("");
const speechVoice = (text: string) => {
if (speechSynthesis.speaking) return;
uttr.text = text;
speechSynthesis.speak(uttr);
};
言語切り替え
どうも uttr.lang
の切り替えだけでは声が変わらない
そして、iosについてはシュミレーターと実機で差異があるため、要確認である
speechVoiceMap
の中身はvoiceURI
がブラウザによってバラバラのため、一部のユニークな文字列だけを入れておく
const uttr = new SpeechSynthesisUtterance("");
const LANG = ["ja-JP", "en-US"] as const;
type SpeechVoiceKey = (typeof LANG)[number];
const SPEECH_VOICE_MAP = new Map<SpeechVoiceKey, string[]>([
["ja-JP", ["Kyoko", "Sayaka"]], // お好きな声で
["en-US", ["Samantha", "Flo", "Ralph"]], // お好きな声で
]);
const setSpeechLang = (
lang: SpeechVoiceKey,
voiceList: SpeechSynthesisVoice[]
) => {
uttr.lang = lang;
uttr.voice =
(SPEECH_VOICE_MAP.get(uttr.lang as typeof lang)?.reduce((c, n) => {
const v = voiceList.find(
(v) => v.voiceURI.includes(n) && v.lang === uttr.lang
);
return v ? [...c, v] : c;
}, [] as typeof voiceList) ?? [])[0] ??
voiceList.find((v) => v.lang === uttr.lang)!;
};
ios16.1にて ja-JP
が存在しない端末が存在したけど、この辺が原因だろうか、要検証
そのため、ja-JP
が選択されたとしても、声が切り替えられない時があるため、リロードで対応する必要がありそう
考察
Windowsの時の日本語はSayaka
が存在するっぽいので、Google翻訳が選ばれないようにしないといけない
音声がそもそも存在しない可能性があるので、これで確認
firefoxが妙に読み上げ速度が速い気がするけど、rate
は相対速度の倍率なので、全ブラウザで同じ速度で読み上げさせることは出来ない
このスクラップは4ヶ月前にクローズされました