ガイド

Go でオフラインのテキスト読み上げ

Go の標準ライブラリーには音声合成がなく、よくある答えは文字数課金のクラウド SDK か、OS のロボット的な声のラッパーです。サービス、ボット、コマンドラインツールでは、どちらにも難点があります。テキストがマシンの外に出るか、声がシステムごとに変わるかです。

このガイドでは、無料の SuperClonica エンジンをローカルの HTTP サーバーとして使い、Go から呼び出す方法を紹介します。自然な声、手元に残る WAV ファイル、どのプラットフォームでもふつうの net/http で。

Go から話す方法

よく話すサービスなら、自前の音声サーバーのほうが安く、プライバシーも守れます。

  • クラウド SDK:自然な声だが、アカウント、キー、文字数課金、そしてテキストは相手のサーバーへ。
  • OS の声のラッパー:オフラインだが、ロボット的でプラットフォームごとに違う。
  • SuperClonica:自然な声、キャラクターの声、独自の声を使えるローカル HTTP サーバー。Docker が動けばどこでもオフラインで。
  • 31言語を話します。中国語はまだ対応していません。

声を無料で聴く

コードを書く前に、どれかの声のページで30〜100文字のフレーズを入力し、言語を選んで生成ボタンを押しましょう。数秒で、アプリに持たせられる声を聴けます。アカウントは不要です。

音声サーバーを起動

NVIDIA のグラフィックカードがあれば cuda イメージで速くなりますが、必須ではありません。

  • どのCPUでもサーバーを起動:docker run -d -p 8000:8000 -v superclonica-models:/models superclonica/superclonica:cpu。
  • 初回起動で Supertonic 3 モデル(約385 MB)をボリュームにダウンロードします。準備ができたかは GET /health でわかります。
  • POST /synthesize は text、voice、lang、seed、normalize を含む JSON を受け取り、16ビットモノラルの WAV を返します。
  • voice は標準名 M1〜M5、F1〜F5、または声のファイルの JSON の中身です。

Go から呼び出す

標準ライブラリーの bytes、io、net/http、os を使えば、リクエストは数行です:voice, _ := os.ReadFile("voice.json"); body := append([]byte(`{"text": "Go からこんにちは!", "lang": "ja", "seed": 7, "voice": `), append(voice, '}')...); res, _ := http.Post("http://localhost:8000/synthesize", "application/json", bytes.NewReader(body)); defer res.Body.Close(); out, _ := os.Create("hello.wav"); defer out.Close(); io.Copy(out, res.Body) 実際のコードではエラーを捨てずに処理してください。標準の声なら、ファイルの代わりに "voice": "F1" を送ります。同じテキスト、声、seed なら常に同じ音声になるので、繰り返すフレーズのファイルはキャッシュしましょう。

本番運用のコツ

http.Client はひとつを適切なタイムアウトで使い回しましょう。ポート 8000 をそのままインターネットに公開しないでください。SUPERCLONICA_API_KEY を設定して Bearer トークンとして送るか、プライベートネットワーク内に置きます。同時リクエストが多いなら SUPERCLONICA_LANES でモデルのコピーを増やし、自分のハードウェアで計測してください。私たちのテストでは短いフレーズが RTX 5070 Ti で 0.12 秒、CPU 4スレッドで 0.43 秒でした。