-
WHAT : TTS란?
TTS(Text To Sound)란 문자 형태의 데이터를 음성으로 변환시켜주는 기술을 말한다. Google, Selvy, Naver clover등의 IT 회사에서 API로 서비스하고 있다.
WHY : 왜 TTS를 쓰는가?
편리하다. 사람의 음성이 필요한 서비스에서 사람이 직접 녹음하는 것을 쉽게 대체할 수 있다.
HOW : TTS 사용방법?
~ google tts를 중심으로..
- node.js 라이브러리 설치
npm install --save @google-cloud/text-to-speech
- node.js 에서 사용법
- google cloud platform 프로젝트 설정 (결제설정 필요)
- 서비스 계정 만들기
- 서비스 계정의 JSON KEY 만들기
- GOOGLE_APPLICATION_CREDENTIALS 환경변수 설정
- 텍스트(파일)를 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(); ```
- 지원되는 모든 음성 나열
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}`); }); });
- 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 ```
- 참고자료
- fs module :
Conversation API
[예시 - 1 : 대화 text 데이터와 음성 데이터를 분리하여 보내는 방식]
- Greeting 화면이 랜더링 되면 front가 back에게 conversation 관련 데이터 조회 요청(get)을 보낸다.(Greeting의 전체 step or step별로 따로)
- back은 DB에 있는 관련 자료를 전부 보내준다.
- 사용자가 스피커를 누르면 front가 back에게 음성 파일 조회 요청(POST)을 보낸다.
- Back이 Google STT에 API 요청을 보내고 google에게서 인코딩된 sound 콘텐츠를 받아서 텍스트파일에 복사한 후, 프론트에 보낸다. → 잠깐만, 근데 꼭 매번 백이 google과 통신을 해야할까? 인코딩한 자료를 db에 저장해두면 안되나..?
- 프론트가 해당 파일을 재생하기 위해 디코딩 한다. 참고 : https://meotlog.tistory.com/41
[예시 - 2 : 대화 text 데이터와 음성 데이터를 한번에 보내는 방식]
- 위와 동일
- back은 db에 있는 관련 자료 + 인코딩된 sound text file을 함께 보낸다.
- 프론트가 해당 파일을 재생하기 위해 디코딩 한다.
- 참고 : Base64이란 무엇일까? / Base64 사용 이유와 인코딩과 디코딩 https://devuna.tistory.com/41
API 없이 구현하는 방법 영상
'기타' 카테고리의 다른 글
컴퓨터가 데이터를 표현하고 이해하는 방식 (0) 2023.04.07 컴퓨터 구조의 큰 그림 (0) 2023.04.06 speech-text-synchronize (0) 2022.12.22 [MAC] 캡스락 대문자 기능 끄기 by. Karabiner-Elements, BTT (0) 2022.10.05