JavaScript의 웹 음성 API를 사용하여 텍스트 음성 변환

39103 단어 texttospeechjavascript
웹 음성 API는 음성 데이터를 웹 응용 프로그램에 병합하는 데 사용됩니다.본 강좌에서 우리는 웹 음성 API를 사용하여 텍스트를 음성으로 전환하는 간단한 웹 페이지를 구축할 것이다.웹 음성 APIhere의 브라우저 호환성을 확인할 수 있습니다.

선결 조건


이 강좌를 계속 공부하려면 다음과 같은 기능이 있어야 합니다.
  • HTML 및 JavaScript에 대해 기본적으로 알고 있습니다.
  • 코드 편집기.사용하겠습니다Visual Studio Code.
  • 웹 페이지를 조회하는 브라우저는 Google Chrome 또는 Mozilla Firefox가 가장 좋다.
  • 프로젝트 디렉토리


    프로젝트에 새 디렉터리를 만들고 index.htmltextToSpeech.js라는 두 개의 새 파일을 만듭니다.
    project-directory/
    |-index.html
    |-textToSpeech.js
    

    HTML 페이지


    HTML 파일에서 다음을 설정합니다.
  • 빈 선택 메뉴입니다.JavaScript에서 제공하는 음성 목록으로 빈 선택 메뉴를 채웁니다.
  • 음량, 음향 높이와 속도 범위 슬라이더.
  • Atextarea를 입력합니다.
  • 음성 제어 버튼.
  • 나는 Bootstrap 5로 웹 페이지의 스타일을 디자인한다.Bootstrap에 대해 아직 익숙하지 않다면, 그들documentation을 확인해서 더 잘 알 수 있도록 하세요.
    <html lang="en">
      <head>
        <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" />
        <link rel="stylesheet" href="index.css" />
        <title>Text to Speech</title>
      </head>
      <body class="container mt-5 bg-dark">
        <h1 class="text-light">Text to Speech</h1>
        <p class="lead text-light mt-4">Select Voice</p>
    
        <!-- Select Menu for Voice -->
        <select id="voices" class="form-select bg-secondary text-light"></select>
    
        <!-- Range Slliders for Volume, Rate & Pitch -->
        <div class="d-flex mt-4 text-light">
          <div>
            <p class="lead">Volume</p>
            <input type="range" min="0" max="1" value="1" step="0.1" id="volume" />
            <span id="volume-label" class="ms-2">1</span>
          </div>
          <div class="mx-5">
            <p class="lead">Rate</p>
            <input type="range" min="0.1" max="10" value="1" id="rate" step="0.1" />
            <span id="rate-label" class="ms-2">1</span>
          </div>
          <div>
            <p class="lead">Pitch</p>
            <input type="range" min="0" max="2" value="1" step="0.1" id="pitch" />
            <span id="pitch-label" class="ms-2">1</span>
          </div>
        </div>
    
        <!-- Text Area  for the User to Type -->
        <textarea class="form-control bg-dark text-light mt-5" cols="30" rows="10" placeholder="Type here..."></textarea>
    
        <!-- Control Buttons -->
        <div class="mb-5">
          <button id="start" class="btn btn-success mt-5 me-3">Start</button>
          <button id="pause" class="btn btn-warning mt-5 me-3">Pause</button>
          <button id="resume" class="btn btn-info mt-5 me-3">Resume</button>
          <button id="cancel" class="btn btn-danger mt-5 me-3">Cancel</button>
        </div>
      </body>
      <script src="./textToSpeech.js"></script>
    </html>
    

    JavaScript 파일


    SpeechSynthesisUtterance 클래스의 실례를 만듭니다.우리는 각종 속성을 사용하여 이 실례를 설정할 것이다.
    let speech = new SpeechSynthesisUtterance();
    

    등록 정보


    현재, 이 SpeechSynthesisUtterance 실례에 속성을 설정합니다.
    우리는 SpeechSynthesisUtterance 실례상의 여섯 가지 속성을 조정할 수 있다.
    그들은 다음과 같습니다.
    언어:language 속성은 언어의 언어를 가져오고 설정합니다.설정하지 않으면 <html lang="en">lang 값을 사용하고 <html lang="en">lang이 설정하지 않으면 사용자 에이전트 기본값을 사용합니다.
    DOMstringBCP 47 language tag을 나타냅니다.
    speech.lang = "en";
    
    텍스트:text 속성은 말할 때 합성된 텍스트를 가져오고 설정합니다.텍스트는 일반 텍스트로 사용할 수 있습니다.우리의 예에서 텍스트 속성은 시작 단추를 눌렀을 때 설정해야 합니다.
    버튼에 클릭 리스트를 추가합니다.단추를 눌렀을 때 textarea 에서 텍스트 값을 가져와 이 속성으로 설정해야 합니다.
    사건 탐지기에 대한 더 많은 정보를 알 수 있습니다. here
    document.querySelector("#talk").addEventListener("click", () => {
      speech.text = document.querySelector("textarea").value;
    });
    
    볼륨:volume 속성은 말의 음량을 가져오고 설정합니다.이것은 부피 값을 나타내는 부동점수로 0(최저)과 1(최고) 사이에 있다.이 속성이 설정되어 있지 않으면 기본값은 1입니다.onInput 범위 슬라이더에 volume 탐지기를 추가하고 슬라이더의 값이 변경될 때 volume 속성을 조정합니다.슬라이더의 최소값, 최대값 및 기본값은 HTML 태그에 설정되어 있습니다.
    웹 페이지의 범위 슬라이더 옆에 표시되는 값<span>도 설정할 수 있습니다.
    document.querySelector("#rate").addEventListener("input", () => {
      // Get rate Value from the input
      const rate = document.querySelector("#rate").value;
    
      // Set rate property of the SpeechSynthesisUtterance instance
      speech.rate = rate;
    
      // Update the rate label
      document.querySelector("#rate-label").innerHTML = rate;
    });
    
    요금율:volume 속성은 말의 속도를 가져오고 설정합니다.이것은 0.1(최저)과 10(최고) 사이의 속도 값을 대표하는 부동점수이다.이 속성이 설정되어 있지 않으면 기본값은 1입니다.rate 범위 슬라이더에 onInput 탐지기를 추가하고 슬라이더의 값이 변경될 때 rate 속성을 조정합니다.슬라이더의 최소값, 최대값 및 기본값은 HTML 태그에 설정되어 있습니다.
    웹 페이지의 범위 슬라이더 옆에 표시되는 값rate도 설정할 수 있습니다.
    document.querySelector("#volume").addEventListener("input", () => {
      // Get volume Value from the input
      const volume = document.querySelector("#volume").value;
    
      // Set volume property of the SpeechSynthesisUtterance instance
      speech.volume = volume;
    
      // Update the volume label
      document.querySelector("#volume-label").innerHTML = volume;
    });
    
    영업:<span> 속성은 말의 음조를 가져오고 설정합니다.0(최소)과 2(최고) 사이의 피치 값을 나타내는 부동 소수점 수입니다.이 속성을 설정하지 않으면 기본 음고는 1입니다.rate 범위 슬라이더에 pitch 탐지기를 추가하고 슬라이더의 값이 바뀔 때 음조 속성을 조정합니다.슬라이더의 최소값, 최대값 및 기본값은 HTML 태그에 설정되어 있습니다.
    웹 페이지의 범위 슬라이더 옆에 표시되는 값onInput도 설정할 수 있습니다.
    document.querySelector("#pitch").addEventListener("input", () => {
      // Get pitch Value from the input
      const pitch = document.querySelector("#pitch").value;
    
      // Set pitch property of the SpeechSynthesisUtterance instance
      speech.pitch = pitch;
    
      // Update the pitch label
      document.querySelector("#pitch-label").innerHTML = pitch;
    });
    
    
    사운드:pitch 속성을 획득하여 말소리에 사용할 소리를 설정합니다.이것은 <span> 대상 중의 하나로 설정해야 한다.설정하지 않으면 언어 언어 설정에 가장 적합한 기본 음성을 사용합니다.
    말의 소리를 설정하려면 pitch 대상에서 사용할 수 있는 소리의 목록을 얻어야 합니다.윈도우 객체가 로드되면 사운드를 즉시 사용할 수 없습니다.이것은 비동기적인 조작이다.음성을 불러올 때 이벤트를 터치합니다.우리는 음성을 불러올 때 실행해야 할 함수를 설정할 수 있다.
    window.speechSynthesis.onvoiceschanged = () => {
      // On Voices Loaded
    };
    
    우리는 voice를 사용하여 음성 목록을 얻을 수 있다.그것은 사용 가능한 SpeechSynthesisVoice 대상 그룹을 되돌려줍니다.목록을 전역 그룹에 저장하고, 웹 페이지의 선택 메뉴를 음성 목록으로 업데이트합니다.
    let voices = []; // global array
    
    window.speechSynthesis.onvoiceschanged = () => {
      // Get List of Voices
      voices = window.speechSynthesis.getVoices();
    
      // Initially set the First Voice in the Array.
      speech.voice = voices[0];
    
      // Set the Voice Select List. (Set the Index as the value, which we'll use later when the user updates the Voice using the Select Menu.)
      let voiceSelect = document.querySelector("#voices");
      voices.forEach((voice, i) => (voiceSelect.options[i] = new Option(voice.name, i)));
    };
    
    현재 보이스 메뉴를 업데이트했습니다. window 이벤트 탐지기를 추가해서 window.speechSynthesis.getVoices() 실례적인 보이스를 업데이트합니다.사용자가 음성을 업데이트할 때, 우리는 색인 번호 (옵션마다 설정된 값) 와 전역 음성 그룹을 사용하여 음성을 업데이트할 것입니다.
    document.querySelector("#voices").addEventListener("change", () => {
      speech.voice = voices[document.querySelector("#voices").value];
    });
    

    컨트롤


    SpeechSynthesis 인스턴스에 컨트롤을 추가합니다.
    시작:
    start 단추를 눌렀을 때, 우리는 SpeechSynthesisVoice 실례를 onChange 방법에 전달해야 한다.텍스트를 음성으로 변환하기 시작합니다.이 방법을 사용하기 전에text 속성을 설정해야 합니다.

    NOTE: If you start another text to speech while an instance is already running, it'll get queued behind the one that is currently running.


    document.querySelector("#talk").addEventListener("click", () => {
      speech.text = document.querySelector("textarea").value;
      window.speechSynthesis.speak(speech);
    });
    
    일시 중지:
    우리는 SpeechSynthesisUtterance 현재 실행 중인 SpeechSynthesisUtterance 실례를 정지할 수 있습니다.파우스 단추를 선택하여 window.speechSynthesis.speak() 이벤트 탐지기를 추가하고, 이 단추를 눌렀을 때 일시 정지 SpeechSynthesisUtterance 실례를 추가합니다.
    document.querySelector("#pause").addEventListener("click", () => {
      window.speechSynthesis.pause();
    });
    
    프로필:
    우리는 window.speechSynthesis.pause() 현재 정지된 click 실례를 복구할 수 있다.리소스 단추를 선택하고 SpeechSynthesisUtterance 이벤트 탐지기를 추가한 다음, 이 단추를 눌렀을 때 SpeechSynthesisUtterance 실례를 복원합시다.
    document.querySelector("#resume").addEventListener("click", () => {
      window.speechSynthesis.resume();
    });
    
    취소:
    우리는 window.speechSynthesis.resume() 현재 실행 중인 click 실례를 취소할 수 있습니다.cancel 단추를 선택하여 SpeechSynthesisUtterance 이벤트 탐지기를 추가하고, 이 단추를 눌렀을 때 SpeechSynthesisUtterance 실례를 취소합니다.
    document.querySelector("#resume").addEventListener("click", () => {
      window.speechSynthesis.resume();
    });
    
    window.speechSynthesis.cancel()의 최종 버전:
    // Initialize new SpeechSynthesisUtterance object
    let speech = new SpeechSynthesisUtterance();
    
    // Set Speech Language
    speech.lang = "en";
    
    let voices = []; // global array of available voices
    
    window.speechSynthesis.onvoiceschanged = () => {
      // Get List of Voices
      voices = window.speechSynthesis.getVoices();
    
      // Initially set the First Voice in the Array.
      speech.voice = voices[0];
    
      // Set the Voice Select List. (Set the Index as the value, which we'll use later when the user updates the Voice using the Select Menu.)
      let voiceSelect = document.querySelector("#voices");
      voices.forEach((voice, i) => (voiceSelect.options[i] = new Option(voice.name, i)));
    };
    
    document.querySelector("#rate").addEventListener("input", () => {
      // Get rate Value from the input
      const rate = document.querySelector("#rate").value;
    
      // Set rate property of the SpeechSynthesisUtterance instance
      speech.rate = rate;
    
      // Update the rate label
      document.querySelector("#rate-label").innerHTML = rate;
    });
    
    document.querySelector("#volume").addEventListener("input", () => {
      // Get volume Value from the input
      const volume = document.querySelector("#volume").value;
    
      // Set volume property of the SpeechSynthesisUtterance instance
      speech.volume = volume;
    
      // Update the volume label
      document.querySelector("#volume-label").innerHTML = volume;
    });
    
    document.querySelector("#pitch").addEventListener("input", () => {
      // Get pitch Value from the input
      const pitch = document.querySelector("#pitch").value;
    
      // Set pitch property of the SpeechSynthesisUtterance instance
      speech.pitch = pitch;
    
      // Update the pitch label
      document.querySelector("#pitch-label").innerHTML = pitch;
    });
    
    document.querySelector("#voices").addEventListener("change", () => {
      // On Voice change, use the value of the select menu (which is the index of the voice in the global voice array)
      speech.voice = voices[document.querySelector("#voices").value];
    });
    
    document.querySelector("#start").addEventListener("click", () => {
      // Set the text property with the value of the textarea
      speech.text = document.querySelector("textarea").value;
    
      // Start Speaking
      window.speechSynthesis.speak(speech);
    });
    
    document.querySelector("#pause").addEventListener("click", () => {
      // Pause the speechSynthesis instance
      window.speechSynthesis.pause();
    });
    
    document.querySelector("#resume").addEventListener("click", () => {
      // Resume the paused speechSynthesis instance
      window.speechSynthesis.resume();
    });
    
    document.querySelector("#cancel").addEventListener("click", () => {
      // Cancel the speechSynthesis instance
      window.speechSynthesis.cancel();
    });
    
    

    결실


    GitHub 페이지here를 사용하여 배포된 프로젝트를 볼 수 있습니다.
    너도 본문GitHub Repository에서 최종 코드를 볼 수 있다.

    한번 되돌아보도록 하겠습니다.

  • 음성 선택 메뉴, 텍스트 영역, 제어 버튼이 포함된 HTML 페이지를 만들었습니다.
  • 새 JavaScript 파일을 만들고 HTML 파일에 링크했습니다.
  • 우리는 새로운 click 대상을 만들었다.
  • 우리는 SpeechSynthesisUtterance 실례의 여섯 가지 속성을 조정했다.그것들은 음고, 음량, 문자, 소리, 속도와 언어이다.
  • 우리는 제어 단추에 탐지기를 추가하여 textToSpeech.js를 눌렀을 때 제어할 수 있습니다.시작, 일시정지, 계속, 취소입니다.
  • 축하해,🥳 해냈어.
    읽어주셔서 감사합니다!

    좋은 웹페이지 즐겨찾기