C# と .NET でオフラインのテキスト読み上げ
C# から話させる昔ながらの方法は System.Speech です。数行で、Windows の声を使い、インターネットも不要。今も動きますが Windows 専用で、声は古めかしく、マシンごとに違います。クラウドのサービスは音質が良いものの、すべてのテキストを外に送り、文字数で課金されます。
このガイドでは第3の方法を紹介します。無料の SuperClonica エンジンをローカルの HTTP サーバーとして動かし、Windows、Linux、macOS のどの .NET アプリからでも呼び出せるようにします。声は自然で、WAV ファイルは手元に残ります。
.NET から話す3つの方法
Windows でのちょっとした試作なら System.Speech で十分。どこでも同じに聞こえる製品の声ならエンジンを。
- System.Speech:Windows に組み込み、オフライン、ロボット的な声、Windows 専用。
- クラウドの音声API:自然な声だが、アカウント、キー、文字数課金、そしてテキストは相手のサーバーへ。
- SuperClonica:自然な声、キャラクターの声、独自の声を使えるローカルサーバー。オフラインで、Docker が動くどの OS でも。
- 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 の中身です。
C# から呼び出す
System.Net.Http、System.Text、System.Text.Json.Nodes を使えば、.NET 6 以降ではリクエストは数行です:using var http = new HttpClient(); var voice = JsonNode.Parse(File.ReadAllText("voice.json")); var body = new JsonObject { ["text"] = "C# からこんにちは!", ["voice"] = voice, ["lang"] = "ja", ["seed"] = 7 }; var res = await http.PostAsync("http://localhost:8000/synthesize", new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json")); File.WriteAllBytes("hello.wav", await res.Content.ReadAsByteArrayAsync()); 標準の声なら、ファイルを読み込む代わりに ["voice"] = "F1" とします。同じテキスト、声、seed なら常に同じ音声になるので、繰り返すフレーズのファイルはキャッシュし、アプリですでに使っている音声ライブラリーで再生しましょう。
本番運用のコツ
HttpClient はアプリの生存期間中ひとつを使い回しましょう。ポート 8000 をそのままインターネットに公開しないでください。SUPERCLONICA_API_KEY を設定して Bearer トークンとして送るか、プライベートネットワーク内に置きます。同時リクエストが多いなら SUPERCLONICA_LANES でモデルのコピーを増やし、自分のハードウェアで計測してください。私たちのテストでは短いフレーズが RTX 5070 Ti で 0.12 秒、CPU 4スレッドで 0.43 秒でした。