はじめに
この記事では Zonos TTS を使用して、URL リクエストで音声を生成できる簡易的な API を作成したのでどんな感じのものかだったり軽く手順について紹介します。
まずは TTS について軽く解説
TTSとは?
TTS(Text-to-Speech) とは、文字テキストを人間の声のように読み上げる技術のことで、
仕組みの流れとしてはまず、入力された文章をAIが理解し、解析してから、解析したテキストを元にAIが音声データを生成します。
TTSの種類としては例としてこのようなものがあります。
・OpenAI TTS(gpt-4o-mini-tts)
ChatGPTで有名なOpenAIが出してるTTS、有料のみでトークン制。
・Gemini-TTS
Googleが出してるTTSで下位モデルなら無料分有りでトークン制、
・Zonos TTS
オープンソースかつ無料で使える。高品質だがその分負荷は高め。
紹介したもの以外にも色々あります。結構前までは棒読みっぽいのが多かったのに気づいたらほぼ違和感を感じないようなものが色々増えてきてびっくりです。
今回は日本語対応していてローカル環境で動かせて無料で使える Zonos TTS を使わせていただきました。
https://github.com/Zyphra/Zonos ←こちらです
ZonosTTS には公式で API もあるみたいなので、後述の解説は ローカル で動かしてみたい人向けかなと思います。ローカル だと GPU への負荷が結構高く、公式では NVIDIA製グラボの3000シリーズ以降推奨 みたいです。
実際にどんな物を作ったのか↓
サーバーを起動してからURLでこんな感じにリクエストを送ります。

するとテキストをAIで解析して音声データとしてファイルを返してくれます。このwavファイルがtext=〇〇の音声データになってます。(解析自体の内部的な処理はさっぱりです🥴)

(後述するコードのままだと認証とかがないのでローカル以外だとセキュリティ的にまずいです)
どんな感じのものが出力されたか気になる方はこちらからダウンロードできます!(後述はしてありますが実際に使ったコードも別ブランチであげています)
https://github.com/kkcjkt/aitextread
全然棒読み感がない音声で出力されるのがすごいです...
今回作ったのはかなり簡易的なものになりますがAPI作成~実際に実行してファイル出力できるまでを簡単に解説していきます。
作ったAIテキスト読み上げAPI解説
私の環境では Ubuntu 24.04.3 LTS を使用しました。(Ubuntuの導入については省きます)
実際にローカルで実行する場合は冒頭でも軽く書きましたが、そこそこの性能がある GPU は必要だと思います。(実際に他環境で試してないのでなんともいえないですが性能が足りていないと多分処理実行中に落ちるのではないかと..)
ちなみに今回使用したグラボは RTX3060ti(8GB) です。
↓から作成する手順になりますがライブラリなどの細かい説明は省いています。
まず Ubuntu 上で Zonos TTS をダウンロードするプロジェクトを作っていきます。
mkdir お好きなフォルダ名
次に作成したフォルダに移動して github から Zonos_TTS をクローンして、クローンしたフォルダに移動します。
git clone https://github.com/Zyphra/Zonos.git
cd Zonos
Zonos の中の .python-version を利用して python をインストール(指定のバージョンがインストールされていない場合)
pyenv install 3.12
そしたら今度はPythonの仮想環境を作ります。
python3 -m venv venv
その後は仮想環境に入ります。
source venv/bin/activate
Zonos と FastAPI 、その他必要な ライブラリ をインストールします。
pip install -e .
pip install fastapi uvicorn
pip install torch
pip install torchaudio
pip install torchcodec
pip install ffmpeg-python
(もしかしたら必要なライブラリが抜けてるかもしれないので足りないライブラリがある場合は追加でインストール)
サーバー用の tts_server.py を作成します。
nano tts_server.py
中身を全部コピーして貼り付けて保存
from fastapi import FastAPI
from fastapi.responses import FileResponse
import torch
import torchaudio
from zonos.model import Zonos
from zonos.conditioning import make_cond_dict
from zonos.utils import DEFAULT_DEVICE as device
import os
import uuid
app = FastAPI()
model = Zonos.from_pretrained("Zyphra/Zonos-v0.1-transformer", device=device)
default_wav, sr = torchaudio.load("assets/exampleaudio.mp3")
default_speaker = model.make_speaker_embedding(default_wav, sr)
@app.get("/tts")
def tts_endpoint(text: str = "テスト"):
"""
URL例:
http://UBUNTU_IP:8000/tts?text=テスト
"""
# Conditioning
cond_dict = make_cond_dict(
text=text,
speaker=default_speaker,
language="ja"
)
conditioning = model.prepare_conditioning(cond_dict)
codes = model.generate(conditioning)
wavs = model.autoencoder.decode(codes).cpu()
out_name = f"tts_{uuid.uuid4()}.wav"
out_path = f"/tmp/{out_name}"
torchaudio.save(out_path, wavs[0], model.autoencoder.sampling_rate)
return FileResponse(out_path, media_type="audio/wav", filename="aispeak.wav")
作成したら以下のコマンドを打ってサーバーを立ち上げます
uvicorn tts_server:app --host 127.0.0.1 --port 8000
この文字が出たらサーバー立ち上げ 成功 です!
以下のコマンドを <>の中は自分の内容に変えて ブラウザのURLの中に打ちます
http://127.0.0.1:8000/tts?text=<喋らせたいテキスト>
処理が上手くいっていればこんな感じで進捗具合を見ることができます。後は処理が完了すると自動でwavファイルがダウンロードされます。
まとめ
元々はゲームのmodに使用して遊ぶ目的で作ったAPIですが流用して色々試せそうだなぁと思ったので気が向いたら色々作ってみようと思います。後はサンプルの音声データをそのまま使いましたが、モデルを変えれば色んな音声で出力してくれます。色々試したくなりますね。
今までPCを使っていて GPU とか VRAM に関してそこまでこだわっていなかったのですが、こういうことをやるってなると 高性能なグラボが欲しい! と思いました。

