Azure AI Foundry「音声ライブ」プレビューを使ってみた!C#実装例とレスポンスの印象
2025.07.31

はじめに
MS開発部の松坂です。Azure AI Foundryで新たに公開されたプレビュー機能「音声ライブ(Voice Live)」を試してみました。
実際に動かしてみた:動画あり
Web UI上で「音声ライブ」を試すと、テキスト入力後、わずか数百ミリ秒で音声レスポンスが返ってくるリアルタイム性に驚かされます。※ 入力音声には、無料で利用可能な音声合成ソフト「VOICEVOX」のキャラクター「ずんだもん」を使用しています。
出力音声は、Azure AI Foundry の「音声ライブ」機能により生成された合成音声(ja-JP-Nanami)です。
プレビュー機能「音声ライブ」とは?
「音声ライブ」はテキストから音声をリアルタイムでストリーミング生成できる機能です。Azure AI FoundryのWeb UI上だけでなく、C#やPython使ってプログラム経由でも利用可能です。また、本機能はWebSocketによるリアルタイム通信を利用しており、HTTPベースのAPIに比べて非常に高速な双方向通信が可能です。現在は eastus2 および swedencentral リージョンでのみ提供されており、音声データはチャンク形式のバイナリとして送受信されます。再生方法は、受信後に合成する方式と、逐次再生する方式のいずれにも対応可能です。

C#から「音声ライブ」を使う流れ
Azureが提供するAPIを利用すれば、C#等のプログラミング言語からも音声ライブ機能を使えます。音声データが分割(チャンク単位)で届くため、用途に応じてリアルタイム再生・まとめて再生の両方が実装できます。WebSocketを用いた Live API の基本的な処理の流れは以下のとおりです。
- WebSocketソケットの作成
- 音声変換リクエストのアップデート送信
- 音声データの送信
- 音声データの受信
C#のコード例
上記流れに沿ってコード例を記載します。1.WebSocketソケットの作成
1 2 3 4 5 6 7 8 9 |
private ClientWebSocket _ws = new(); _ws.Options.SetRequestHeader("api-key", "<Azure AI Seaviceのリソースキー>"); var uri = new Uri( ($"<Azure AI Serviceのエンドポイント>/voice-live/realtime").Replace("https://", "wss://") + $"?api-version=<Live APIのバージョン>&model=<利用モデル名>" ); await _ws.ConnectAsync(uri); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
string paramSessionUpdate = @" { ""type"": ""session.update"", ""session"": { ""turn_detection"": { ""type"": ""azure_semantic_vad"", ""threshold"": 0.3, ""prefix_padding_ms"": 200, ""silence_duration_ms"": 200, ""remove_filler_words"": false, ""end_of_utterance_detection"": { ""model"": ""semantic_detection_v1"", ""threshold"": 0.1, ""timeout"": 4 } }, ""input_audio_noise_reduction"": {""type"": ""azure_deep_noise_suppression""}, ""input_audio_echo_cancellation"": {""type"": ""server_echo_cancellation""}, ""voice"": { ""name"": ""ja-JP-Nanami:DragonHDLatestNeural"", ""type"": ""azure-standard"", ""temperature"": 0.8 } } }"; byte[] bytes = Encoding.UTF8.GetBytes(paramSessionUpdate); await _ws.SendAsync(new ArraySegment(bytes), WebSocketMessageType.Text, true); |
1 2 3 4 5 6 7 8 9 |
string json = $@"{{ ""type"": ""input_audio_buffer.append"", ""audio"": ""{audioData}"", ""event_id"": """" }}"; var buffer = Encoding.UTF8.GetBytes(json); await _ws.SendAsync(new ArraySegment(buffer), WebSocketMessageType.Text, true); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
while (_ws.State == WebSocketState.Open) { messageBuffer.Clear(); WebSocketReceiveResult result; do { result = await _ws.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); if (result.MessageType == WebSocketMessageType.Close) { await _ws.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed", CancellationToken.None); return; } messageBuffer.AddRange(buffer[..result.Count]); } while (!result.EndOfMessage); if (result.MessageType == WebSocketMessageType.Text) { string message = Encoding.UTF8.GetString(messageBuffer.ToArray()); try { using var doc = JsonDocument.Parse(message); if (doc.RootElement.TryGetProperty("type", out var typeProp)) { var type = typeProp.GetString(); if (type == "response.audio.delta") { var base64 = doc.RootElement.GetProperty("delta").GetString(); // バイナリデータを受信するので、ここで再生させるか合成するなら保存 } else if (type == "response.output_item.done") { // 分割されている音声を合成するならこのタイミング } } } catch (Exception jsonEx) { Console.WriteLine("JSON parse error: " + jsonEx.Message); Console.WriteLine("Message received: " + message); } } |
現時点での課題と今後への期待
使っていて以下の点が気になりました。- 日本語を含む一部の言語では、入力が意図通りに認識されなかったり、指定した言語で正しく応答しない場合があります。
- 音声ライブAPIはリアルタイムの音声出力に特化しており、自動文字起こし(Speech-to-Text)機能は組み込まれていません。AzureAIFoundry上で表示される文字はLiveAPIとは別途で処理されていると思われます。
- 現時点では、Azure AI Foundry内の既存エージェントと連携するための機能は提供されていないようです。
まとめ
Azure AI Foundryの「音声ライブ」機能は、リアルタイムの音声合成APIとしては非常に完成度が高く、開発者視点でも導入しやすい構造になっています。とはいえ、日本語や多言語対応の質、STTやエージェント連携の不足など、今後の改善点もいくつか見えてきました。正式リリースに向けてどんな改良がされるのか、今後も追いかけたいと思います。
本記事の内容は、2024年7月時点におけるAzure AI Foundryのプレビュー版に基づいています。今後、正式リリースに向けて大幅な仕様変更が行われる可能性がありますので、最新情報の確認をおすすめします。
以上、最後までご愛読いただき
ありがとうございました。
お問い合わせは、
以下のフォームへご連絡ください。