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秒くらいの待ち時間があるので、句読点などで渡すテキストを分割して利用するのが良いのかなーと思いました。



この記事が気に入ったらサポートをしてみませんか?