ElevenLabs를 사용한 음성 합성 프로그램

SSO·2024년 11월 7일

ElevenLabs API를 사용하여 ChatGPT가 생성한 텍스트 응답을 음성으로 변환하려고한다.
ElevenLabs는 텍스트를 자연스러운 음성으로 합성하는 서비스를 제공한다.
ElevenLabs는 이미 학습된 많은 모델들이 있고, 혹은 Fine-tuning을 통해서 내 목소리를 녹음할 수 있다. 대략 시간 단위로 있어야하는 것이 좋다.
목소리 녹음 시, 처음에 인증해야한다. (모델이 유출되면, 보이스피싱 등 위험도가 높기 때문이다.)
파인튜닝을 사용하려면 요금제를 사용해야한다.


1) ElevenLabs API 설치 및 설정
ElevenLabs는 직접적으로 API를 추상하해주지는 않고,
직접 request라는 라이브러리를 통해 HTTP 메서들르 호출해야한다.
ElevenLabs API를 사용하기 위해 필요한 라이브러리를 설치한다.

pip install requests

2) ElevenLabs API를 사용한 음성 합성 프로그램
아래 코드를 사용하여 텍스트를 음성으로 변환하는 프로그램을 작성한다.
<ElevenLabs API 코드>


import os
import requests
from pydub import AudioSegment
from pydub.playback import play
import io
#from dotenv import load_dotenv

#.env 파일 로드(env파일에 저장해놓을 경우)
#load_dotenv()
#.env 파일에서 API 키와 URL을 가져온다.
#api_key = os.getenv("API_KEY") 
#url = os.getenv("API_URL")

# 3. 그 후에, output_filename을 통해 파일을 어떤 방식으로 저장할 지 설정해둔다. 즉 설정 가능한 변수을 나타낸다.
output_filename = "output_audio.mp3"


url = "모델 URL"

# 2. header을 설정해서 HTTP 요청을 날릴 때, 메서드에 포함시킬 body와 header을 만든다.
headers = {
    "xi-api-key": "API - KEY",
    "Content-Type": "application/json"
}
#"xi-api-key": "api_key"

# 1. 입력할 데이터를 만들어놓았고, 이는 사용자로부터 문장을 입력받는다.
text = input("텍스트를 입력하세요: ")

# 음성 생성 요청을 보낸다.
data = {
    "text": text,
    "model_id": "eleven_multilingual_v2",
    "voice_settings": {
        "stability": 0.3,
        "similarity_boost": 1,
        "style": 1,
        "use_speaker_boost": True
    }
}

#오류방지를 위해 ElevenLabs 서비스에서 stability는 0.3 이하 추천하지 않는다고 한다.
#similarity_boost : 얼마나 목소리와 유사한지를 나타낸다.
#style: 사람 특유의 억양을 얼마나 반영할 것인지를 나타낸다. style을 높일 경우, 기존 녹음한(한국어 기준) 한국어처럼 말하게 된다.

#request 라이브러리를 통해 POST에 해당하는 호출을 한다. 그리고 데이터 header을 전달해준다.
#stream=True라는 옵션은 응답 데이터를 스트리밍 방식으로 받는지 지정하는 부분이다.
response = requests.post(url, json=data, headers=headers, stream=True)

#응답코드 200은 HTTP 상태 코드를 나타내는데, API 요청이 성공했을 시 200이 나타난다. 성공적으로 되었으면 오디오 데이터가 있는데, 오디오 데이터는 byte 단위이기 때문에 byte 문자열을 초기화해주고 chunk 단위로 읽어온 다음, 응답데이터를 처리해준다. 큰 파일을 효율적으로 처리하기 위해서다. 

#AudioSegment라는 것은 Pydub 패키지 속의 내용이며, 오디오 관련 작업을 많이 처리하는데, byte 데이터를 iO.BytesIO를 사용해서 메모리 파일 객체로 변환한 뒤, from_mp3를 사용해서 MP3 파일로 바꿔준다. 변환된 오디오를 지정한 파일의 이름으로 저장하는 것이 export다.

if response.status_code == 200:
    audio_content = b""
    for chunk in response.iter_content(chunk_size=1024):
        if chunk:
            audio_content += chunk

    segment = AudioSegment.from_mp3(io.BytesIO(audio_content))
    segment.export(output_filename, format="mp3")
    print(f"Success! Wrote audio to {output_filename}")

    # 출력 후, 오디오를 재생한다.
    play(segment)
else:
    print(f"Failed to save file: {response.status_code}")

#play도 Pydub의 기능들 중 하나이며, 오디오 파일을 재생해준다고 생각하면 된다.

프로그램을 실행하면, 입력된 텍스트가 음성으로 변환되어 mp3 파일로 저장된다. 그 후 파일을 재생하여 음성을 확인할 수 있다.

#text 부분에 여러 문장 및 여러 줄로 작성하고 싶으면 text = """ 여기에 원하는 문장을 작성하면됩니다. """로 표현할 것.

profile
개발자로 한걸음씩!

0개의 댓글