ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TTS
    기타 2022. 12. 22. 23:27

    WHAT : TTS란?

    TTS(Text To Sound)란 문자 형태의 데이터를 음성으로 변환시켜주는 기술을 말한다. Google, Selvy, Naver clover등의 IT 회사에서 API로 서비스하고 있다.

    WHY : 왜 TTS를 쓰는가?

    편리하다. 사람의 음성이 필요한 서비스에서 사람이 직접 녹음하는 것을 쉽게 대체할 수 있다.

    HOW : TTS 사용방법?

    ~ google tts를 중심으로..

    https://cloud.google.com/text-to-speech/docs/create-audio-text-client-libraries?hl=ko#client-libraries-usage-nodejs

    • node.js 라이브러리 설치
    npm install --save @google-cloud/text-to-speech
    
    • node.js 에서 사용법
    1. 기본 세팅(https://cloud.google.com/text-to-speech/docs/before-you-begin?hl=ko)
    • google cloud platform 프로젝트 설정 (결제설정 필요)
    • 서비스 계정 만들기
    • 서비스 계정의 JSON KEY 만들기
    • GOOGLE_APPLICATION_CREDENTIALS 환경변수 설정
    1. 텍스트(파일)를 base64 인코딩 오디오 데이터로 변환 → 오디오 합성 요청에 SSML을 사용하면 자연스러운 인간의 음성과 매우 비슷한 오디오를 생성할 수 있습니다. 특히 SSML은 음성에서 오디오 출력의 일시중지 표현 방식이나 오디오의 날짜, 시간, 두문자어, 약어 발음 방법에 대한 세부적인 제어를 제공합니다.

    즉 SSML은 날짜 및 시간 등의 숫자와 특수문자 읽기방식, 끊어읽기, 강조하기 등의 읽기 방식을 직접 설정할 수 있어 좀 더 자연스러운 말하기가 가능합니다.

    Text-to-Speech API에서 지원하는 SSML 요소에 대한 자세한 내용은 SSML 참조를 참조하세요.

    ```jsx
    // Imports the Google Cloud client library
    const textToSpeech = require('@google-cloud/text-to-speech');
    
    // Import other required libraries
    const fs = require('fs'); // fs는 file 관련 패키지(readfile, writefile등)
    const util = require('util'); // 
    // Creates a client
    const client = new textToSpeech.TextToSpeechClient();
    async function quickStart() {
      // The text to synthesize
      const ssml = '<speak>hello, world!</speak>';
    
      // Construct the request
      const request = {
        input: {text: text},
        // Select the language and SSML voice gender (optional)
        voice: {languageCode: 'en-US', ssmlGender: 'NEUTRAL'},
        // select the type of audio encoding
        audioConfig: {audioEncoding: 'MP3'},
      };
    
      // Performs the text-to-speech request
      const [response] = await client.synthesizeSpeech(request);
      // Write the binary audio content to a local file
      const writeFile = util.promisify(fs.writeFile);
      await writeFile('output.mp3', response.audioContent, 'binary');
      console.log('Audio content written to file: output.mp3');
    }
    quickStart();
    ```
    
    1. 지원되는 모든 음성 나열
    const textToSpeech = require('@google-cloud/text-to-speech');
    
    const client = new textToSpeech.TextToSpeechClient();
    
    const [result] = await client.listVoices({});
    const voices = result.voices;
    
    console.log('Voices:');
    voices.forEach(voice => {
      console.log(`Name: ${voice.name}`);
      console.log(`  SSML Voice Gender: ${voice.ssmlGender}`);
      console.log(`  Natural Sample Rate Hertz: ${voice.naturalSampleRateHertz}`);
      console.log('  Supported languages:');
      voice.languageCodes.forEach(languageCode => {
        console.log(`    ${languageCode}`);
      });
    });
    1. base64 데이터를 디코딩하여 오디오 데이터를 MP3와 같은 재생 가능한 오디오 파일로 변환

    오디오 데이터는 바이너리 데이터입니다. gRPC 응답에서 직접 바이너리 데이터를 읽을 수 있지만 REST 요청에 응답할 때는 JSON이 사용됩니다. JSON은 바이너리 데이터를 직접 지원하지 않는 텍스트 형식이므로 Text-to-Speech가 Base64로 인코딩된 응답 문자열을 반환합니다. 기기에서 재생하려면 먼저 base64로 인코딩된 텍스트 데이터를 응답에서 바이너리로 변환해야 합니다. Text-to-Speech의 JSON 응답은 base64로 인코딩된 오디오 콘텐츠를 audioContent 필드에 포함합니다.

    ```json
    {
      "audioContent": "//NExAARqoIIAAhEuWAAAGNmBGMY4EBcxvABAXBPmPIAF//yAuh9Tn5CEap3/o..."
    }
    ```
    
    base64를 오디오 파일로 디코딩하려면 다음 안내를 따르세요.
    
    ```bash
    // base-64로 인코딩된 콘텐츠만 텍스트 파일에 복사합니다.
    // base64 명령줄 도구를 사용하여 원본 텍스트 파일을 디코딩합니다.
    
    $ base64 --decode SOURCE_BASE64_TEXT_FILE > DESTINATION_AUDIO_FILE
    ```
    

    Conversation API

    [예시 - 1 : 대화 text 데이터와 음성 데이터를 분리하여 보내는 방식]

    1. Greeting 화면이 랜더링 되면 front가 back에게 conversation 관련 데이터 조회 요청(get)을 보낸다.(Greeting의 전체 step or step별로 따로)
    2. back은 DB에 있는 관련 자료를 전부 보내준다.
    3. 사용자가 스피커를 누르면 front가 back에게 음성 파일 조회 요청(POST)을 보낸다.
    4. Back이 Google STT에 API 요청을 보내고 google에게서 인코딩된 sound 콘텐츠를 받아서 텍스트파일에 복사한 후, 프론트에 보낸다. → 잠깐만, 근데 꼭 매번 백이 google과 통신을 해야할까? 인코딩한 자료를 db에 저장해두면 안되나..?
    5. 프론트가 해당 파일을 재생하기 위해 디코딩 한다. 참고 : https://meotlog.tistory.com/41

    [예시 - 2 : 대화 text 데이터와 음성 데이터를 한번에 보내는 방식]

    1. 위와 동일
    2. back은 db에 있는 관련 자료 + 인코딩된 sound text file을 함께 보낸다.
    3. 프론트가 해당 파일을 재생하기 위해 디코딩 한다.

    API 없이 구현하는 방법 영상

    댓글