탐색으로 건너뛰기

텍스트 음성 변환 스트리밍

이 가이드에서는 텍스트 음성 변환을 스트리밍하고, 필요에 따라 오디오를 AWS S3에 업로드하는 방법을 안내합니다.

이 가이드에서는 3가지 방법을 다룹니다. 파일로 음성을 생성하는 방법, 오디오 응답을 직접 스트리밍하는 방법, 그리고 선택적으로 생성된 오디오를 AWS S3 버킷에 업로드하여 서명된 URL로 공유하는 방법입니다.

이 가이드는 API 키와 SDK를 설정했다고 가정합니다. 아직 완료하지 않았다면 먼저 빠른 시작을 완료하세요. 선택 사항인 S3 업로드 섹션을 사용하려면 S3에 액세스할 수 있는 AWS 계정도 필요합니다.

스트리밍이 작동하는 방식이 궁금하신가요? 오디오 스트리밍 이해하기에서 프로토콜, 버퍼링 및 지연 시간 간의 절충점을 자세히 설명합니다.

텍스트 음성 변환(파일)

텍스트를 음성으로 변환하고 파일로 저장하려면 ElevenLabs SDK의 convert 메서드를 사용한 후, 로컬에 .mp3 파일로 저장합니다.

import os
import uuid
from dotenv import load_dotenv
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs
load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(
api_key=ELEVENLABS_API_KEY,
)
def text_to_speech_file(text: str) -> str:
# Calling the text_to_speech conversion API with detailed parameters
response = elevenlabs.text_to_speech.convert(
voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voice
output_format="mp3_22050_32",
text=text,
model_id="eleven_flash_v2_5", # use the flash model for low latency
# Optional voice settings that allow you to customize the output
voice_settings=VoiceSettings(
stability=0.0,
similarity_boost=1.0,
style=0.0,
use_speaker_boost=True,
speed=1.0,
),
)
# uncomment the line below to play the audio back
# play(response)
# Generating a unique file name for the output MP3 file
save_file_path = f"{uuid.uuid4()}.mp3"
# Writing the audio to a file
with open(save_file_path, "wb") as f:
for chunk in response:
if chunk:
f.write(chunk)
print(f"{save_file_path}: A new audio file was saved successfully!")
# Return the path of the saved audio file
return save_file_path

다음과 같이 이 함수를 실행할 수 있습니다.

text_to_speech_file("Hello World")

텍스트 음성 변환(스트리밍)

파일로 저장하지 않고 오디오를 직접 스트리밍하려면 스트리밍 기능을 사용할 수 있습니다.

import os
from typing import IO
from io import BytesIO
from dotenv import load_dotenv
from elevenlabs import VoiceSettings
from elevenlabs.client import ElevenLabs
load_dotenv()
ELEVENLABS_API_KEY = os.getenv("ELEVENLABS_API_KEY")
elevenlabs = ElevenLabs(
api_key=ELEVENLABS_API_KEY,
)
def text_to_speech_stream(text: str) -> IO[bytes]:
# Perform the text-to-speech conversion
response = elevenlabs.text_to_speech.stream(
voice_id="pNInz6obpgDQGcFmaJgB", # Adam pre-made voice
output_format="mp3_22050_32",
text=text,
model_id="eleven_multilingual_v2",
# Optional voice settings that allow you to customize the output
voice_settings=VoiceSettings(
stability=0.0,
similarity_boost=1.0,
style=0.0,
use_speaker_boost=True,
speed=1.0,
),
)
# Create a BytesIO object to hold the audio data in memory
audio_stream = BytesIO()
# Write each chunk of audio data to the stream
for chunk in response:
if chunk:
audio_stream.write(chunk)
# Reset stream position to the beginning
audio_stream.seek(0)
# Return the stream for further use
return audio_stream

다음과 같이 이 함수를 실행할 수 있습니다.

text_to_speech_stream("This is James")

추가 - AWS S3에 업로드하고 안전한 공유 링크 받기

오디오 데이터가 파일 또는 스트림으로 생성되면 사용자와 공유하고 싶을 수 있습니다. 이를 위한 한 가지 방법은 AWS S3 버킷에 업로드하고 안전한 공유 링크를 생성하는 것입니다.

데이터를 S3에 업로드하려면 AWS 액세스 키 ID, 보안 액세스 키, AWS 리전 이름을 .env 파일에 추가해야 합니다. 자격 증명을 찾으려면 다음 단계를 따르세요.

  1. AWS 관리 콘솔에 로그인합니다. AWS 홈 페이지로 이동하여 계정으로 로그인하세요.
AWS 콘솔 로그인
  1. IAM(Identity and Access Management) 대시보드에 액세스합니다. 서비스 메뉴의 “Security, Identity, & Compliance”에서 IAM을 찾을 수 있습니다. IAM 대시보드에서는 AWS 서비스에 대한 액세스를 안전하게 관리할 수 있습니다.
AWS IAM 대시보드
  1. 새 사용자 생성(필요한 경우): IAM 대시보드에서 “Users”를 선택한 후 “Add user”를 선택하세요. 사용자 이름을 입력합니다.
AWS IAM 사용자 추가
  1. 권한 설정: 부여하려는 액세스 수준에 따라 정책을 사용자에게 직접 연결합니다. S3 업로드에는 AmazonS3FullAccess 정책을 사용할 수 있습니다. 하지만 작업 수행에 필요한 최소 권한만 부여하는 것이 모범 사례입니다. S3 버킷에서 필요한 작업만 구체적으로 허용하는 사용자 지정 정책을 만들 수 있습니다.
AWS IAM 사용자 권한 설정
  1. 사용자 검토 및 생성: 설정을 검토하고 사용자를 생성합니다. 생성 후 액세스 키 ID와 보안 액세스 키가 표시됩니다. 이 자격 증명은 반드시 다운로드하여 안전하게 보관하세요. 보안 액세스 키는 이 단계 이후 다시 조회할 수 없습니다.
AWS 액세스 보안 키
  1. AWS 리전 이름 가져오기: 예: us-east-1
AWS 리전 이름

AWS S3 버킷이 없다면 다음 단계에 따라 새 버킷을 만들어야 합니다.

  1. S3 대시보드에 액세스합니다. 서비스 메뉴의 “Storage”에서 S3를 찾을 수 있습니다.
AWS S3 대시보드
  1. 새 버킷 생성: S3 대시보드에서 “Create bucket” 버튼을 클릭합니다.
버킷 생성 버튼 클릭
  1. 버킷 이름을 입력하고 “Create bucket” 버튼을 클릭합니다. 다른 버킷 옵션은 기본값으로 둘 수 있습니다. 새로 추가한 버킷이 목록에 표시됩니다.
새 S3 버킷 이름 입력
S3 버킷 목록

pip 및 npm을 사용하여 AWS 서비스와 상호작용하기 위한 boto3를 설치합니다.

pip install boto3

그런 다음 다음과 같이 .env 파일에 환경 변수를 추가합니다.

AWS_ACCESS_KEY_ID=your_aws_access_key_id_here
AWS_SECRET_ACCESS_KEY=your_aws_secret_access_key_here
AWS_REGION_NAME=your_aws_region_name_here
AWS_S3_BUCKET_NAME=your_s3_bucket_name_here

오디오 스트림을 S3에 업로드하고 서명된 URL을 생성하려면 다음 함수를 추가하세요.

import os
import boto3
import uuid
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
AWS_REGION_NAME = os.getenv("AWS_REGION_NAME")
AWS_S3_BUCKET_NAME = os.getenv("AWS_S3_BUCKET_NAME")
session = boto3.Session(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
region_name=AWS_REGION_NAME,
)
s3 = session.client("s3")
def generate_presigned_url(s3_file_name: str) -> str:
signed_url = s3.generate_presigned_url(
"get_object",
Params={"Bucket": AWS_S3_BUCKET_NAME, "Key": s3_file_name},
ExpiresIn=3600,
) # URL expires in 1 hour
return signed_url
def upload_audiostream_to_s3(audio_stream) -> str:
s3_file_name = f"{uuid.uuid4()}.mp3" # Generates a unique file name using UUID
s3.upload_fileobj(audio_stream, AWS_S3_BUCKET_NAME, s3_file_name)
return s3_file_name

그런 다음 텍스트에서 생성한 오디오 스트림으로 업로드 함수를 호출할 수 있습니다.

s3_file_name = upload_audiostream_to_s3(audio_stream)

오디오 파일을 S3에 업로드한 후, 파일 액세스를 공유할 서명된 URL을 생성합니다. 이 URL은 일정 시간이 지나면 만료되므로 임시 공유에 안전합니다.

이제 다음과 같이 파일에서 URL을 생성할 수 있습니다.

signed_url = generate_presigned_url(s3_file_name)
print(f"Signed URL to access the file: {signed_url}")

파일을 여러 번 사용하려면 서명된 URL은 만료되므로 직접 저장하지 말고, S3 파일 경로를 데이터베이스에 저장한 다음 필요할 때마다 서명된 URL을 다시 생성해야 합니다.

모든 내용을 연결하려면 다음 스크립트를 사용할 수 있습니다.

import os
from dotenv import load_dotenv
load_dotenv()
from text_to_speech_stream import text_to_speech_stream
from s3_uploader import upload_audiostream_to_s3, generate_presigned_url
def main():
text = "This is James"
audio_stream = text_to_speech_stream(text)
s3_file_name = upload_audiostream_to_s3(audio_stream)
signed_url = generate_presigned_url(s3_file_name)
print(f"Signed URL to access the file: {signed_url}")
if __name__ == "__main__":
main()

마무리

이제 텍스트를 음성으로 변환하고 오디오 파일을 공유할 서명된 URL을 생성하는 방법을 알게 되었습니다. 이 기능을 통해 콘텐츠를 동적으로 만들고 공유할 수 있는 수많은 기회가 열립니다.

이를 활용해 만들 수 있는 몇 가지 예시는 다음과 같습니다.

  1. 교육용 팟캐스트: 학생이 필요할 때 이용할 수 있는 맞춤형 교육 콘텐츠를 만듭니다. 교사는 수업을 오디오 형식으로 변환하여 S3에 업로드하고, 학생에게 링크를 공유해 기존 교실 환경 밖에서도 더 몰입도 높은 학습 경험을 제공할 수 있습니다.

  2. 웹사이트 접근성 기능: 텍스트 콘텐츠를 오디오 형식으로 제공하여 웹사이트의 접근성을 높입니다. 이를 통해 시각 장애가 있거나 청각 학습을 선호하는 사람이 웹사이트 정보를 더 쉽게 이용할 수 있습니다.

  3. 자동화된 고객 지원 메시지: FAQ나 주문 업데이트와 같은 자동화된 맞춤형 고객 지원 오디오 메시지를 제작합니다. 기존 텍스트 이메일보다 더 몰입도 높은 고객 경험을 제공할 수 있습니다.

  4. 오디오북 및 내레이션: 전체 책이나 단편 소설을 오디오 형식으로 변환하여 독자가 문학을 즐기는 새로운 방식을 제공합니다. 저자와 출판사는 콘텐츠 제공 범위를 다양화하고 읽기보다 듣기를 선호하는 독자에게 다가갈 수 있습니다.

  5. 언어 학습 도구: 학습자에게 오디오 수업과 연습 문제를 제공하는 언어 학습 도구를 개발합니다. 이를 통해 발음과 듣기 능력을 목표에 맞춰 연습할 수 있습니다.

다음 단계