나의 발자취

[Azure AI] Azure AI 앱 서비스 사용해보기 - 음성 서비스 본문

Backend

[Azure AI] Azure AI 앱 서비스 사용해보기 - 음성 서비스

달모드 2024. 11. 4. 14:59

 

참고 사이트: https://learn.microsoft.com/ko-kr/azure/ai-services/speech-service/language-support?tabs=stt

 

언어 지원 - Speech Service - Azure AI services

음성 서비스는 음성 번역과 함께 음성 텍스트 변환 및 텍스트 음성 변환을 위해 다양한 언어를 지원합니다. 이 문서에서는 서비스 기능별 언어 지원에 대한 종합 목록을 제공합니다.

learn.microsoft.com

 

변수 설정 : tts, stt

 

API key 설정

 

 

자, 이제 Body에 들어갈 내용(SSML)을 살펴보자.

SSML (Speech Synthesis Markup Language)는 텍스트를 음성으로 변환할 때 음성의 발음, 속도, 강세 등을 제어하기 위해 사용하는 XML 기반 언어이다.

<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="ko-KR">
<voice name="ko-KR-InJoonNeural">
    먼저 드라마 작가 예수정이 작품을 탈고한 후 동료들에게 축하받는 장면이 그려졌다. 예수정은 처음부터 이순재와 김용건을 염두에 두고 각본을 써내려갔지만, 방송사와 의견을 조율하는 과정에서 주인공을 젊은 배우로 교체하지 않으면 제작이 어렵다는 통보를 받았다.
</voice>
</speak>

 

포스트맨에 XML로 설정하고 넣어주고,

 



 

헤더 설정

아래와 같이 두 개의 헤더를 추가로 설정해줘야 한다.

 

 

1) Content-Type

헤더에 보면 Content-Type가 xml만 되어있을 건데,

 

이와 같이 ssml+xml로 Content-Type을 새로 추가해주면 위 캡처처럼 기존 Content-Type은 crossline 처리가 된다.

 

2) X-Microsoft-OutputFormat

아래와 같은 값을 설정을 해준다. (riff-16khz-16bit-mono-pcm)

 

 

POST 요청 시, 아래와 같이 음성을 재생할 수 있는 화면이 나타난다.

 

우측에 보면 파일로 저장할 수 있다.

 

 

 

 

 

 

 

 

 

 

이제 자바스크립트로 가서,

.env에 키값을 설정해주고,

아래와 같이 코드를 짜준다.

const axios = require("axios");
require("dotenv").config();
const fs = require("fs");

const endpoint = `${process.env.TTS_ENDPOINT}/cognitiveservices/v1`;
const apiKey = process.env.SPEECH_APIKEY;
const text = `‘김건희 여사 공천 개입 의혹’ 핵심 당사자인 명태균씨는 4일 더불어민주당이 윤석열 대통령과 자신간 녹취 파일을 추가 공개한 것과 관련해 "민주당은 대통령·영부인 추가 녹취가 없다. 국민을 상대로 사기 치지 마라"고 주장했다.`;

const ssml = `<speak version="1.0" xmlns="http://www.w3.org/2001/10/synthesis" xml:lang="ko-KR">
<voice name="ko-KR-InJoonNeural">
    ${text}
</voice>
</speak>`;

const headers = {
  "Ocp-Apim-Subscription-Key": apiKey,
  "Content-Type": "application/ssml+xml",
  "X-Microsoft-OutputFormat": "riff-16khz-16bit-mono-pcm",
};

 

그 아래에 post를 써준다.

 

이렇게 되면 Promise 를 반환하기 때문에, .then으로 체이닝을 하여 구현을 해준다.

 

arraybuffer는 2기종 통신을 하기 때문에, 데이터로 받아서 fs로 처리를 해준다.

 


STT 하기

일단 엔드포인트를 바꿔준다.

 

바이너리 파일로, 아까 저장된 파일을 업로드한다

 

 

그리고 header에 Content-Type 는 Octet으로 새로 추가.

 

Params에서 

language - ko-KR 추가

 

저장 후 확인

STT JS 파일로 작성

const axios = require("axios");
require("dotenv").config();
const fs = require("fs");

const endpoint = `${process.env.STT_ENDPOINT}/speech/recognition/conversation/cognitiveservices/v1?language=ko-KR`;
const apiKey = process.env.SPEECH_APIKEY;
const audioFilePath = "./output.wav";

const headers = {
  "Ocp-Apim-Subscription-Key": apiKey,
  "Content-Type": "application/octet-stream",
  "Transfer-Encoding": "chunked",
};

function convertSpeechToText() {
  // 음성 파일 읽어서 binary 데이터로 변환
  const audioData = fs.readFileSync(audioFilePath);

  axios
    .post(endpoint, audioData, {
      headers,
    })
    .then((res) => {
      console.log("STT Response: ", res.data);
    })
    .catch((error) => {
      console.log(error);
    });
}

convertSpeechToText();

 

 

실행 결과

Comments