テキスト読み上げのストリーミング

このガイドでは、テキスト読み上げをストリーミングする方法と、オプションでオーディオをAWS S3にアップロードする方法を説明します。

このガイドでは、音声をファイルとして生成する、オーディオレスポンスを直接ストリーミングする、生成したオーディオをAWS S3バケットにアップロードして署名付きURLで共有する(任意)の3つの方法を紹介します。

このガイドは、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. 語学学習ツール:学習者にオーディオレッスンや練習問題を提供する語学学習支援ツールを開発できます。発音やリスニングスキルを目的に合わせて練習できます。

次のステップ