2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

前回はじめてWeb Speech APIを触ってみてみたが、

今回は、Web Speech APIには音量やピッチだけでなく様々な声の設定ができるようなので

自由にWeb Speech APIの設定して出力できるアプリを作ってみる。

前回の記事

Web Speech API とは(参考記事)

成果物の画像

WebSpeechAPIお試しツール作ってみる01.jpg

WebSpeechAPIお試しツール作ってみる02.jpg

プロジェクトの作成

今回は、Svelteベースに作成してみる

(だた、筆者がsvelte(ver5)使ってみたかっただけで選定理由はありません🙇‍♂️)

下記がコードになりますが、

speechSynthesisを扱う際に注意しなければいけないところは、

window.speechSynthesis.getVoices() は、非同期で読み込まれるため、

Mount時にwindow.speechSynthesis.onvoiceschangedを使用して設定する。

(はじめて使用したときに、このことを知らなくてSelectBoxが空になり焦りました🥲)

App.svelte
  // 略
<script>
  import { onMount } from "svelte";

  let voices = $state([]);
  let voiceIx = $state(0);
  let volume = $state(1);
  let pitch = $state(1);
  let rate = $state(1);
  let text = $state("");

  onMount(() => {
    voices = window.speechSynthesis.getVoices();
    if (
      voices.length > 0 &&
      (voiceIx === undefined || voiceIx >= voices.length)
    ) {
      voiceIx = 0;
    }
    window.speechSynthesis.onvoiceschanged = () => {
      voices = window.speechSynthesis.getVoices();
    };   
  });
  const Speech = () => {
    const utterance = new SpeechSynthesisUtterance();
    utterance.voice = voices[voiceIx];
    utterance.lang = voices[voiceIx].lang;
    utterance.volume = volume;
    utterance.pitch = pitch;
    utterance.rate = rate;
    utterance.text = text;
    speechSynthesis.speak(utterance);
  };
</script>
App.svelte
<main>
  <h1>Web Speech Sample</h1>
  <div class="set">
    <label for="voicetext">VoiceText</label>
    <input type="text" id="voicetext" bind:value={text} />
  </div>
  <div class="set">
    <label for="voice">Voice</label>
    <select name="voice" id="voice" bind:value={voiceIx}>
      {#each voices as voice, i}
        <option value={i}>{voice.name}</option>
      {/each}
    </select>
  </div>
  <div class="set">
    <label for="volume">Volume_{volume}</label>
    <input
      type="range"
      min="0"
      max="1"
      step="0.1"
      id="volume"
      bind:value={volume}
    />
  </div>
  <div class="set">
    <label for="pitch">Pitch_{pitch}</label>
    <input
      type="range"
      min="0"
      max="2"
      step="0.1"
      id="pitch"
      bind:value={pitch}
    />
  </div>
  <div class="set">
    <label for="rate">Rate_{rate}</label>
    <input
      type="range"
      min="0.1"
      max="10"
      step="0.1"
      id="rate"
      bind:value={rate}
    />
  </div>
  <button onclick={Speech}>Speech</button>
</main>

// 略

完成!

成果物ソース

デモURL

ソース

まとめ

Web Speech APIの機能と出力サンプルアプリを実装してみた。

上記で記載した通り、speechSynthesis の voices は非同期で読み込まれるため、

初期化時など注意をして使っていきたい。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?