Voice Live SDK 1.2.0で変わった点を確かめた話
Microsoft FoundryのVoice Live APIは、音声で会話するエージェントを作るためのAPIです。その.NET SDK(Azure.AI.VoiceLive)が1.2.0になっていたので一度提供されている機能を一通り見てみたくなり調べてみました。前回の記事では、SDK 1.1.0の時点で「公式SDKからは2026-06-01-previewを選べないので、最新のpreviewを試すならAPIを直接叩くしかない」と書きましたが、1.2.0でこの前提が変わっています。
位置づけとしてはAPIのほうでPreview提供など先行して機能実装されている状態で、SDKは後からAPIに合わせて機能が追従しているようです。ただ、APIは基本的にはAPI実行できる仕組みさえあれば開発言語などの制約はあまり受けることがありません。一方、メッセージなど自分で構築が必要な部分も多いところがすこし面倒なところです。
SDKが提供されるると実用面で大きいのは、これまでAPIを直接叩かないと試せなかった機能が、数行で書けるようになったことだと思います。写真から作るアバター、WebSocketで受けるアバター映像、MCP、ツール待ちの間の短い発話(interim response)あたりが該当します。
本記事では、SDK 1.2.0で選べるようになったAPIバージョン、増えた型、SDKに型が無い機能の分類、1.1.0からの移行について紹介します。
本記事は、これから続けるVoice Liveの機能解説シリーズの土台にあたります。以降の回は「SDK 1.2.0+API 2026-07-15(GA)」の上で、機能を1つずつ扱っていきます。
検証に使ったコードはこちらです(SDK 1.2.0対応済み)。
本記事は2026年10月時点の情報です。対象は.NET SDK(Azure.AI.VoiceLive)1.2.0とVoice Live API 2026-07-15(どちらも執筆時点で最新)です。2026-07-15は各言語のSDKの既定バージョンになっています。
SDKから選べるAPIバージョン
.NET SDKは、接続するAPIバージョンをVoiceLiveClientOptions.ServiceVersionで選びます。1.1.0と1.2.0で選べるものは次のとおりです。
ServiceVersion |
APIバージョン | 区分 | 1.1.0 | 1.2.0 |
|---|---|---|---|---|
V2025_10_01 |
2025-10-01 |
GA | 〇 | 〇 |
V2026_01_01_PREVIEW |
2026-01-01-preview |
preview | 〇 | 〇 |
V2026_04_10 |
2026-04-10 |
GA | - | 〇 |
| (なし) | 2026-06-01-preview |
preview | - | - |
V2026_07_15 |
2026-07-15 |
GA | - | 〇 |
2026-06-01-previewは1.2.0にも入っていません。つまり、「6月版はSDKから選べない」という点は変わっておらず、6月版の機能の大半がGA(2026-07-15)としてSDKから使えるようになった、と言うほうが正確だと思います。
APIバージョンはVoiceLiveClientOptionsを作るときにだけ指定でき、セッションを始めるときには変えられません。版を変えるときは、オプションとクライアントを作り直します。例えば、最初に以下のように記述します。
var clientOptions = new VoiceLiveClientOptions(
VoiceLiveClientOptions.ServiceVersion.V2026_07_15);
var endpoint = new Uri("https://<your-resource>.cognitiveservices.azure.com");
var client = new VoiceLiveClient(endpoint, new DefaultAzureCredential(), clientOptions);
2026-07-15で使える機能とSDKの対応
2026-07-15のAPIリファレンスはMS Learnで公開されています。
What's newの要点は次のとおりです。
-
2026-06-01-preview比で追加されたのは、セッションのexpires_at(サーバが決めるセッションの有効期限)だけ - 6月版のnative voice、client EC reference、streaming text input、parallel tool calls、hosted agent invocationは07-15でも引き続き使える
- smart turn detectionとWebRTCはpreviewのまま
これをSDK 1.2.0の中身と突き合わせると、機能ごとの対応は次のようになります。SDKの列は、〇が型で書ける、△が型はあるが書くのに手間がかかる、×がSDKでは書けない(APIを直接叩く)です。
| 機能 | API 2026-07-15
|
SDK 1.2.0 | SDKでの書き方 |
|---|---|---|---|
| Photo avatar(sceneを含む) | 〇 | 〇(1.1.0から型あり) | 型で書ける |
| WebSocket映像 | 〇 | 〇(1.1.0から型あり) | 型で書ける |
| Personal voice / avatar-sync voice | 〇 | 〇(1.1.0から型あり) | 型で書ける |
| Semantic EOU / Auto-truncation | 〇 | 〇(1.1.0から型あり) | 型で書ける |
| MCP | 〇 | 〇(1.1.0から型あり) | 型で書ける |
| Parallel tool calls | 〇 | 〇(1.2.0で追加) | AllowParallelToolCalls |
| Hosted agent invocation | 〇 | 〇(1.2.0で追加) |
InvokeInputとServerEventResponseInvocationDelta
|
セッションの有効期限(expires_at) |
〇(07-15で追加) | 〇(1.2.0で追加) | ExpiresOn |
| Interim response | 〇 | △ | 型を作り、BinaryDataに書き出して渡す |
| client EC reference | 〇 | △(1.2.0で追加) | 設定は型で書けるが、参照音声はアプリ側で作る |
| native voice / streaming text input | 〇 | ×(型がinternal) | APIを直接叩く |
foundry_agentツール |
〇(2026-04-10から) |
×(型が無い) | APIを直接叩く |
| smart turn detection / WebRTC音声接続 | preview | × | APIを直接叩く(preview版を指定) |
サンプルのSDKコンソールでは、表で〇の機能のうち次の10機能を2026-07-15で実機確認できました。
Photo avatar / Photo avatar + scene / WebSocket映像(
response.video.delta) /azure-personalvoice / Semantic EOU(多言語) / Auto-truncation / MCPサーバ / Interim response / Parallel tool calls /avatar-syncvoice
この表の〇△×は、SDKが追いつくたびに変わります。6月版をAPI直叩きで検証していた機能は、GA化と1.2.0の対応でSDK側に移りました。いまAPIを直接叩いているfoundry_agentも、SDKが対応すれば〇に移ると思います。
1.1.0から変わったこと
1.2.0で6月版の機能が一気にSDKに入った、と思っていたのですが、1.1.0と1.2.0の型を突き合わせると、増えた型は6つだけでした(削除された型はありません)。photo avatarやWebSocket映像、interim response、MCPの型は、実は1.1.0から入っていました。
1.1.0で型があったのに「SDKからは試せない」と判断していたのは、型があっても、その機能を返してくれるAPIバージョンを選べなかったからです。
わかりやすいのがWebSocket映像です。ServerEventResponseVideoDeltaの型は1.1.0にありましたが、1.1.0で選べる最新の2026-01-01-previewのサーバイベントにはresponse.video.deltaがありません。つまり、受け取る型はあるのに、送ってくれる版につなげない状態でした。
1.2.0で変わったのは型ではなく、2026-04-10 / 2026-07-15というGA版につなげるようになったことです。これで、1.1.0から入っていた型が実際に使えるようになりました。
1.1.0の時代にこれらを試すにはAPIを直接叩く必要がありましたが、いまはSDKの数行で書けます。たとえば写真から作るアバターは、型を組み立ててAvatarに入れるだけです。
options.Avatar = new AvatarConfiguration(character, customized)
{
AvatarKind = AvatarConfigKind.PhotoAvatar,
BaseMode = PhotoAvatarBaseMode.Vasa1,
Video = new VideoParams { Bitrate = 2000000, Codec = "h264" }
};
各機能の中身は、このあとのシリーズで1つずつ扱います。
1.2.0で増えた型と、1.1.0からあった型の一覧
調べ方:NuGetパッケージに同梱されているXMLドキュメントから型とメンバーの一覧を取り、版どうしで差分を取りました。XMLにはinternalの型も出てくるので、公開範囲はアセンブリのメタデータ(System.Reflection.MetadataでTypeAttributesを読む)で確認しています。
| 1.2.0で増えた型 | 対応する機能 | 公開範囲 |
|---|---|---|
EchoCancellationReferenceSource |
client EC reference | public |
ServerEventResponseInvocationDelta |
hosted agent invocation | public |
AzureRealtimeNativeVoice |
azure-realtime-native voice |
internal |
AzureRealtimeNativeVoiceName |
同上 | internal |
ClientEventInputTextDelta |
streaming text input | internal |
ClientEventInputTextDone |
同上 | internal |
型ではなくメンバーとして増えたものは次のとおりです。
-
ServiceVersion.V2026_04_10/V2026_07_15 -
VoiceLiveSessionOptions.AllowParallelToolCalls(parallel tool calls) -
AudioEchoCancellation.ReferenceSource/Channels(client EC reference) -
ResponseCreateParams.InvokeInput(hosted agent invocation) -
VoiceLiveSessionResponse.ExpiresOn(expires_at)
1.1.0から入っていた型は次のとおりです。
| 機能 | 型(1.1.0から存在) |
|---|---|
| Photo avatar |
AvatarConfigKind.PhotoAvatar / PhotoAvatarBaseMode / SceneParams
|
| WebSocket映像 |
AvatarOutputProtocol / ServerEventResponseVideoDelta
|
| Interim response |
LlmInterimResponseConfig / StaticInterimResponseConfig
|
| MCP |
VoiceLiveMcpServerDefinition / McpApprovalKind
|
| Personal voice / avatar-sync voice |
AzurePersonalVoice / AzureAvatarSyncVoice
|
| Semantic EOU |
AzureSemanticEouDetectionMultilingualほか |
| Auto-truncation | AzureSemanticVadTurnDetection.AutoTruncate |
SDKで書くときの注意
1.2.0でも、SDKから素直に使えない機能が残っています。ここで注意したいのは、SDKに型が無いことと、その機能がpreviewであることは別の話だという点です。機能の表で×と△にしたものを、理由ごとに見ていきます。
SDKでは書けない機能
foundry_agentツール(APIはGA、SDKに型が無い)
Foundryのエージェントをセッションのツールとして呼ぶfoundry_agentツール(公式の言うchat-supervisorパターン)は、2026-04-10(GA)のリファレンスで既に定義されています。それでもSDK 1.2.0には型がありません。
これはpreviewだからではなく、SDKの実装がAPIに追いついていないだけです。session.updateのtoolsにJSONで書けば、GAのAPIとして使えます。このシリーズでも、この回だけはAPIを直接叩く形で書く予定です。
hosted agent invocationは、Invocationsプロトコルで動くホストされたエージェントと音声で会話するための機能です。Voice Liveはエージェントが返すテキストを読み上げ、それ以外のイベントはresponse.invocation.deltaでそのままクライアントに渡します。どんなイベントが届くかは、エージェントの実装次第です。音声で返す内容とは別に、エージェント独自のデータをクライアントに届けるための仕組みのようです。エージェントへの入力は、response.createのinvoke_inputで渡せます。SDK 1.2.0にも受信用のServerEventResponseInvocationDeltaが入っています。
foundry_agent(エージェントをツールとして呼ぶ)とは名前が似ているだけなので、混同しないように注意してください。
native voiceとstreaming text input(APIはGA、型がinternal)
1.2.0で増えた6つの型のうち4つはinternalでした。
AzureRealtimeNativeVoice(native voice)とClientEventInputTextDelta / Done(streaming text input)は、型はSDKの中にあるのですが、アプリからは使えません。
どちらも07-15ではGAとして「引き続き使える」とされている機能なので、使うならAPIを直接叩くことになります。
smart turn detectionとWebRTC(APIでもpreview)
07-15のWhat's newには次のように明記されています。
Smart turn detection and WebRTC remain in preview.
― Voice Live2026-07-15API reference
SDK 1.2.0が持つ発話終端(EOU)検出の型も、semantic系の3つ(AzureSemanticEouDetection / ...En / ...Multilingual。送られるモデル名はsemantic_detection_v1 / _en / _multilingual)だけで、smart turn detectionに相当する型はありません。
公式がpreviewとしていて、SDKにも無いので、ここは「previewで提供されている機能」です。2026-06-01-previewをAPI直叩きで指定すると、smart turn detectionは実機で動作しました。
APIを直接叩くときに気をつけること
ここまでの機能をAPIで書く場合は、SDKが肩代わりしていた部分を自分で書くことになります。
- メッセージ(
session.updateなど)のJSONを自分で組み立てる。キー名はすべてsnake_caseで、手で書くと間違えやすい - previewの機能は、接続するAPIバージョンにpreview版(
2026-06-01-previewなど)を指定する - client EC referenceのように、接続時のクエリ(
&features=client_ec_reference:true)で有効にする機能がある
型はあるが書きにくい機能
interim response
ツール呼び出しの待ち時間に「確認しますね」のような短い発話を話させるinterim responseには、設定用のLlmInterimResponseConfigという型があります。ところが、それを受け取るVoiceLiveSessionOptions.InterimResponseの型がBinaryDataです。
そのため、型で組み立ててから自分でシリアライズして渡すことになります。
var interim = new LlmInterimResponseConfig
{
Triggers = { InterimResponseTrigger.Tool, InterimResponseTrigger.Latency },
LatencyThreshold = TimeSpan.FromMilliseconds(2000),
Model = "gpt-4.1-mini",
Instructions = "Say a short, natural filler in the user's language while you wait.",
MaxCompletionTokens = 50
};
// 設定は型で書けるが、受け取る側が BinaryData なので書き出して渡す
options.InterimResponse = ModelReaderWriter.Write(interim);
ModelReaderWriter.Writeを通すと、実際に送られるJSONのキー名(interim_response / llm_interim_responseなどすべてsnake_case)が正しく出ます。JSONを手で書くとキー名を間違えやすいところなので、型を通せる場面では通したほうが安全です。
client EC reference
client EC referenceは、エコー除去の参照に、サーバ内部のTTSではなく実際にスピーカーから鳴った音を使う機能です。1.2.0でEchoCancellationReferenceSourceとAudioEchoCancellation.ReferenceSource / Channelsが入ったので、設定自体は型で書けます。
ただし、送る音声を「マイク」と「実際の再生音」を交互に並べたステレオPCMにする必要があります。この参照音声の時間合わせが難しく、型があっても実装の大半はアプリ側になります。接続時に&features=client_ec_reference:trueを付ける点もあわせて、詳しくは音声入力の品質の回で扱います。
型の扱いで注意する点
1.2.0を触っていて引っかかった点を3つ書いておきます。どれもコンパイルは通るので気づきにくいです。
映像と音声のDeltaの型
音声のSessionUpdateResponseAudioDelta.Deltaはデコード済みのBinaryDataですが、映像のServerEventResponseVideoDelta.Deltaはbase64のstringのままです。どちらもIntelliSenseの説明は"base64-encoded"なので、説明文だけでは区別できません。型を見て判断してください。
case ServerEventResponseVideoDelta videoDelta:
// 音声と違って base64 文字列のまま届くので自分でデコードする
byte[] frame = Convert.FromBase64String(videoDelta.Delta);
webSocketVideo.WriteFrame(frame);
break;
AzureAvatarSyncVoiceのコンストラクタ
AzureAvatarSyncVoiceのコンストラクタが受け取るのは、ベースモデル(PersonalVoiceModels)です。ところがPersonalVoiceModelsは文字列から暗黙変換できるので、アバター名を渡してもコンパイルが通り、アバター名がモデル名として送られます。
アバター名はAvatarConfigurationのCharacter(+Customized = true)に入れます。
semantic EOUとsmart turn detection
semantic EOUとsmart turn detectionは、どちらもVADのend_of_utterance_detectionにネストして書くので、設定の形がそっくりです。サンプルのSDKコンソールでも、当初「smart end-of-turn」という名前でsemantic EOUを送っていました(現在はsemantic_eouに改名済み)。
semantic EOUとsmart turn detectionは別物です。SDK 1.2.0で使えるのはsemantic EOUのほうです。
1.1.0から1.2.0への移行
コードの修正
1.1.0から1.2.0へは、簡単です。サンプルでは、パッケージの版を上げただけでビルドが通り、テストもすべて通りました。依存関係は推移的にAzure.Coreが1.57.0から1.61.0に上がり、System.ClientModel 1.15.0が入ります。
SDK 1.2.0が依存するAzure.Core(1.61.0)には、DefaultAzureCredentialなどの資格情報の型が入っています。古いAzure.Identity(サンプルでは1.14.2)を参照したままにすると、同じ型が二重に定義されてCS0433になります。その場合は、Azure.Identityの参照を外してください。新しいAzure.Identity(1.21.0など)では、型がAzure.Core側に移っているようです。
1.1.0 betaからの破壊的変更
1.1.0のbeta(1.1.0-beta.4など)から上げる場合は、betaからGAの間で名前が変わった型に引っかかります。1.0.0にはそもそもMCPやアバター種別の型が無いので、影響を受けるのはbetaで先行して使っていた人です。サンプルで直したのは次の3点です。
| 1.1.0-beta.4 | 1.1.0(GA)以降 |
|---|---|
MCPApprovalType |
McpApprovalKind |
AvatarConfiguration.Type |
AvatarConfiguration.AvatarKind |
| URLを文字列で渡す |
System.Uriで渡す |
options.Tools.Add(new VoiceLiveMcpServerDefinition("deepwiki", new Uri(url))
{
RequireApproval = new RequireApprovalOption(McpApprovalKind.Never)
});
まとめ
- SDK 1.2.0で
2026-04-10/2026-07-15(どちらもGA)が選べるようになりました。2026-06-01-previewは選べません。 - 1.2.0で変わったのは型ではなく、1.1.0からあった型を実際に使えるGA版につなげるようになったことです。
- 1.2.0で増えた型は6つで、そのうち4つはinternalです。
- SDKで書けない機能は、APIはGAでSDKが未対応のもの(
foundry_agent、native voice、streaming text input)と、APIでもpreviewのもの(smart turn detection、WebRTC)に分かれます。 - interim responseとclient EC referenceは、型はありますが書くのに手間がかかります。
- 機能がGAでSDKに公開された型があればSDKで、それ以外はAPIを直接叩いて書きます。
- 1.1.0から1.2.0へは、コードを修正せずに移行できました。
次回からは、このSDK 1.2.0+2026-07-15を土台にして、機能を1つずつ扱っていきます。
シリーズ構成
| 回 | テーマ | SDK 1.2.0で書けるか |
|---|---|---|
| 1 | エージェントの「間」を埋める(semantic EOU / auto-truncation / interim response) | 〇 |
| 2 | 音声入力の品質を上げる(noise reduction / echo cancellation / client EC reference) | △ client EC referenceは参照音声を自作 |
| 3 | MCPサーバのツールと並列ツール呼び出し | 〇 |
| 4 | Foundryエージェントをツールとして呼ぶ(foundry_agent) |
× API直叩き |
| 5 | Personal Voice(公開済み) | 〇 |
| 6 | アバターの使い分け(標準・写真・ビデオ) | 〇 |
| 7 | WebSocket映像とWebRTC | 〇 |
| 番外 | WebRTC音声接続に.NETのSIPSorceryでつなぐ | × API直叩き(preview) |