OpenAIのストリーミングTTSを試してみた
ストリーミング形式の場合、Streamlitとかでは多分実装できないなど、ちょっとサクッと試しにくい部分があったので簡単にFastAPIでのバックエンドAPIを実装してみました。
以下のリポジトリから実装コードなどを確認できます。
実装コード
from fastapi import FastAPI
from pydantic import BaseModel
from openai import OpenAI
from pydub import AudioSegment
from pydub.playback import play
import io
from dotenv import load_dotenv
import os
# .envから環境変数をロード
load_dotenv()
# OpenAIのクライアントを作成
client = OpenAI()
app = FastAPI()
class Text(BaseModel):
text: str
@app.post("/stream_and_play/")
async def stream_and_play(text: Text):
# OpenAIの音声生成APIを呼び出し、結果を取得します
response = client.audio.speech.create(
model="tts-1",
voice="alloy",
input=text.text,
)
# バイナリ形式のレスポンス内容をバイトストリームに変換します
byte_stream = io.BytesIO(response.content)
# バイトストリームからオーディオデータを読み込みます
audio = AudioSegment.from_file(byte_stream, format="mp3")
# オーディオを再生します
play(audio)
# オーディオデータをファイルに書き込みます
audio.export("output.mp3", format="mp3")
# 成功メッセージを返します
return {"message": "音声の再生と保存が成功しました"}
感想
思った以上に早くなかったなというのが所感です笑
短い文章の場合は、通常のTTSに比べてそんなに時間に差はないなという感じがしましたが、長い文章の場合は多分差が出てくる気がします。
ただし長めの文章の場合でも、最初1~2秒くらいの待ち時間があるので、句読点などで渡すテキストを分割して利用するのが良いのかなーと思いました。
この記事が気に入ったらサポートをしてみませんか?