Closed5

SpeechSynthesis備忘録

暁の流星暁の流星

音声対応しているか

const canUseSpeechSynthesisText =
  "speechSynthesis" in window
    ? "このブラウザは音声合成に対応しています"
    : "このブラウザは音声合成に対応していません";
暁の流星暁の流星

言語切り替え

どうも 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 が存在しない端末が存在したけど、この辺が原因だろうか、要検証
https://developer.apple.com/forums/thread/105624
そのため、ja-JPが選択されたとしても、声が切り替えられない時があるため、リロードで対応する必要がありそう

暁の流星暁の流星

考察

Windowsの時の日本語はSayakaが存在するっぽいので、Google翻訳が選ばれないようにしないといけない
https://www.ad-muse.com/column/speechsynthesis/


音声がそもそも存在しない可能性があるので、これで確認
https://support.apple.com/ja-jp/111798#:~:text=「画面の読み上げ」および「,声」を選択します。


firefoxが妙に読み上げ速度が速い気がするけど、rateは相対速度の倍率なので、全ブラウザで同じ速度で読み上げさせることは出来ない
https://stackoverflow.com/questions/25223547/speech-synthesis-api-volume-rate-and-pitch-dont-work
https://developer.mozilla.org/ja/docs/Web/API/SpeechSynthesisUtterance/rate

このスクラップは4ヶ月前にクローズされました