Voice Live APIでエージェントをオリジナルのアバターで話させる
Microsoft FoundryのVoice Live APIは、音声で会話するエージェントを作るためのAPIで、音声認識・応答の生成・音声合成をまとめて扱えます。そのうえで、応答を話す声とアバターの映像も選べるようになっていて、次のような使い方ができます。
- Microsoftが用意した標準アバター、音声モデルをそのまま使う
- 写真1枚から自分のアバターを作る(photo avatar)
- 録音した音声から自分用の音声モデルを作る(personal voice)
- 撮影した動画から自分のアバターを作る(custom video avatar)
本記事では、アバターのパターンを整理したうえで、標準アバターとカスタム写真アバターの準備と設定、最後にカスタムビデオアバターの声(avatar-sync voice)について紹介します。声の設定はアバターとは独立しているので、Personal Voiceは別記事にまとめました。
本記事はVoice Live機能解説シリーズの第6回です。前提となるSDK 1.2.0とAPI 2026-07-15(GA)の話は起点の記事にまとめています。
シリーズの記事一覧(SDK 1.2.0 / API 2026-07-15)
-
Voice Live SDK 1.2.0の変更点とAPI 2026-07-15 GA
SDKに型が無い機能の分類 -
Voice Live APIで会話の「間」を扱う
先に話す・言いよどみを待つ・割り込む・待ち時間に話す -
Voice Live の音声入力の品質を上げる
ノイズ抑制・エコー除去・Live-Reference AEC の選び方 -
Voice LiveでMCPサーバのツールを使う
function callingとの違いと並列ツール呼び出し -
Voice LiveでFoundryのエージェントをツールとして呼ぶ
chat-supervisorパターンの使い方と前段モデルの選び方 -
30秒の音声で「自分の声」を作って Microsoft Foundry エージェントを喋らせる
Personal Voice の申請から実装まで - Voice Live APIのアバターを使い分ける(本記事)
標準・カスタム写真・カスタムビデオの設定と実装 -
Voice Liveのアバター映像をWebSocketで受ける
WebRTCとの違いと映像の形式
番外編:Voice LiveのWebRTC音声接続に.NETのSIPSorceryでつなぐ
SDPを1行ずつ突き合わせた記録
検証に使ったコードはこちらで公開しています。
本記事は2026年10月時点の情報です。対象はVoice Live API 2026-07-15(GA)と.NET SDK Azure.AI.VoiceLive 1.2.0です。photo avatarの設定項目(type: photo-avatar、model、scene)はGA版のAPIリファレンスに入っており、SDK 1.2.0でも型で書けます。
アバターの4パターン
全体像は次のとおりです。
| パターン | 元になるもの | 申請 | 準備するもの | 見た目 |
|---|---|---|---|---|
| 標準video avatar | Microsoft提供の撮影済みキャラ | 不要 | なし | 全身 |
| 標準photo avatar | Microsoft提供の34体 | 不要 | なし | 頭部のみ |
| カスタムphoto avatar | 写真1枚(自分の写真かAI生成) | 要 | 写真、実写なら同意動画 | 頭部のみ |
| カスタムvideo avatar | 撮影した動画 | 要 | 10分以上のスタジオ撮影 | 全身 |
選び方は、次のようになります。
- とりあえず動かしたいときは、標準を使います。申請が要らないので即日試せます
- 自分の顔にしたいときは、カスタムphoto avatarを使います。写真1枚で済みます
- 全身で、指定した動きをさせたいときは、カスタムvideo avatarを使います。ただし撮影のコストがかなり大きくなります
「自分の顔で、自分の声で喋らせたい」だけであれば、カスタムphoto avatarとPersonal Voiceの組み合わせで足ります。custom video avatarのvoice-sync-for-avatarも同じ狙いの機能ですが、10分以上のスタジオ撮影が前提です。
興味本位で利用してみましたが、最低限の10分の動画から1アバター生成するのに必要な計算リソースが30cu/h程度必要でした。金額換算で約7万円ほどかかります。必要なクオリティなどを考慮して活用が必要そうです。写真1枚と30秒の音声で済むほうが、手軽だと思います。
準備
リソースの作成から、C#で最初の音声会話を動かすところまでは、公式のクイックスタートに沿って進めると準備できます。アバターを使う場合は、リソースを作る前に次の対応リージョンと利用申請を確認してください。
対応リージョン
アバター機能はどのリージョンでも使えるわけではありません。用途によって対応リージョンも違うので、リソースを作る前に確認しておかないと、後から作り直すことになります。
| 機能 | 対応リージョン |
|---|---|
| リアルタイムアバター / バッチ / カスタムアバター |
westus2 eastus eastus2 southcentralus southeastasia centralindia westeurope swedencentral northeurope italynorth francecentral
|
| カスタム写真アバターの作成 | 上と同じ11リージョン |
| カスタム ビデオ アバター トレーニング |
westus2 / southeastasia / westeuropeの3つのみ |
アバターの音声同期(voice-sync-for-avatar) |
westus2 eastus eastus2 southeastasia westeurope swedencentral
|
francecentralは容量が限られている旨の注記があります。
japaneastとjapanwestは対象外なので、日本リージョンに寄せている構成ではアバターが使えません。
さらに、Personal Voiceの対応リージョンとも一致しません。声とアバターを1つのリソースで揃えたい場合、両方に対応しているのはeastus / eastus2 / southeastasia / swedencentral / westeurope / westus2の6つです。
最新の一覧はSpeech Serviceリージョンの表の「音声合成アバター」タブで確認できます。
Microsoft Foundryは従量課金で、リソースを作ったりモデルをデプロイしただけでは課金されません。この機能のためだけに別リージョンの環境を用意する、という選択も取れます。
カスタム写真アバターの利用申請(Limited Access)
標準アバターは申請なしで使えます。カスタム写真アバターはLimited Access機能で、資格と使用条件に基づいてアクセスが制限されているため、先に申請が必要です。実際に使ってみるとわかりますが、そこそこ再現性が高いため、ディープフェイクなどの悪用も踏まえてこのような申請方式をとっているのかもしれません。
- Limited Access registration formを開く
- 組織に関連付けられているメールアドレスで、フォームを記入して提出する
公式のLimited Accessのページでは、対象者が次のように書かれています。
Only customers managed by Microsoft, meaning those who are working directly with Microsoft account teams, are eligible for access.
また、公式のFAQには審査の目安とメールアドレスの条件が書かれています。
お申し込み後、5 から 10 営業日以内に審査に関するご連絡を差し上げます。
登録フォームには、組織に関連付けられているメール アドレスを使用してください。個人のメール アドレスで提出された登録フォームは拒否されます。
注釈として、連絡先に使えるメールアドレスに関しては、Gmail等は利用できません。Microsoftでいえばいわゆる組織アカウントのメールアドレスを使う必要があります。おそらく、個人のメールアドレスで出したフォームは拒否される可能性が高いです。
フォームはPersonal Voiceと共通ですが、申請は機能ごとに出す必要があります。私は、アバターとPersonal Voiceで計2回提出しました。
標準アバターを使う
標準video avatar(全身)
Microsoftが用意した全身キャラクターです。ローワン、セリーヌ、ニア、マリク、ハリー、リサ、ロリ、マックス、メグなどがあり、キャラクターによって複数のスタイル(ビジネス、カジュアル、フォーマルなど)を持ちます。
characterとstyleで指定します。
"avatar": {
"type": "video-avatar",
"character": "lisa",
"style": "casual-sitting",
"customized": false,
"output_protocol": "webrtc",
"video": {
"bitrate": 2000000,
"codec": "h264",
"crop": {
"top_left": [560, 0],
"bottom_right": [1360, 1080]
},
"resolution": { "width": 1920, "height": 1080 },
"background": { "color": "#FFFFFFFF" }
}
}
video avatarは広いフレームの中に全身が配置されているため、cropを指定して切り出さないと背景ばかりの映像になります。上の例では1920x1080の中央付近(560〜1360)を抜いています。
標準video avatarには、Voice Liveで使ううえで知っておきたい制約が3つあります。
1つ目は、2026年12月で使えなくなるアバターとスタイルがあることです。Jeffのアバターと、Lisaのgraceful-sitting / graceful-standing / technical-sitting / technical-standingは、2026年12月から利用できなくなります。それまでに別の標準アバターへ切り替える、カスタムアバターを作る、サービス側が選ぶ代替アバターに任せる、のいずれかが必要です。なおLisaのこの4スタイルは、もともとリアルタイムのTTS APIでは使えません(Voice Liveはリアルタイム側なので、廃止を待たずに選べません)。
2つ目は、ジェスチャーがバッチ合成のみであることです。キャラクターごとに用意されているジェスチャー(hello、thanksなど)はバッチ合成API専用で、リアルタイムAPIでは使えません。
3つ目は、実在の俳優に基づくアバターがあることです。Harry、Jeff、Lisa、Lori、Max、Megは実在の俳優をもとに作られており、利用はMicrosoftと俳優のライセンス契約の有効性に依存します。契約が切れると使えなくなります(Jeffの廃止がその例です)。変更の際はMicrosoftから事前に通知されます。
長期運用するプロダクトに標準アバターを組み込む場合は、1つ目と3つ目を考えておく必要があります。
Lisaにはbusiness-sitting / business-standing / coach-sitting / coach-standingの4スタイルがプレビューで追加されています。廃止されるgraceful / technical系の置き換え先としては、まずこのあたりが候補になります。
標準photo avatar
頭部のみのアバターです。34体が用意されており、それぞれベースモデル(vasa-1またはvasa-2)が決まっています。
adrian, amara, amira, anika, bianca, camila, carlos, clara, darius, diego,
elise, farhan, faris, gabrielle, hyejin, imran, isabella, layla, liwei, ling,
marcus, matteo, rahul, rana, ren, riya, sakura, simone, zayd, zoe
leonie, leonie professional, george, marcel
こちらはcustomizedをfalseのままにします。申請は不要なので、Voice Liveでアバターが動くことを確認したいだけなら、ここから始めるのが早いです。
なお、標準のphoto avatarはすべてstyleがN/Aで、video avatarのようなスタイル指定はできません。
vasa-2はプレビューで、次の制約があります。
- 使えるリージョンはWest US 2 / Central India / Southeast Asia / Sweden Centralの4つだけ
- バッチ合成は非対応(リアルタイムのみ)
-
vasa-2のキャラクターはmodelにvasa-2を指定する必要があります。vasa-1のキャラクターにvasa-2を指定することはできません(逆も同じ)
キャラクターとベースモデルの対応は、公式のサポートされている標準アバターの「Photo avatars」の表で確認できます。以前この一覧は「Talking heads」という名前でしたが、現在は「Photo avatars」に変わっています。
カスタム写真アバターを作る
Microsoft FoundryのSpeechから作る
作成場所はMicrosoft Foundryで、Speech Studioではありません。
- Microsoft Foundryにサインインし、[新しいFoundry]のトグルがONになっていることを確認する
- アバターを作るリソースのプロジェクトを開き、上部メニューの[ビルド]を選択する
- 左ペインの[サービス]を選び、表示されたサービスから[Speech]を選択する
- [Custom models]タブを開き、[カスタマイズ]の一覧にある[作成]ボタンを押す
- [モデルの選択]で[Azure Speech - Text to Speech Avatar]、[種類]で[写真アバター]を選び、アバター名を入力して[次へ]ボタンを押す
- [データ]で画像を追加する(後述)
- 実写の場合は、[アバター タレントの登録]で同意動画を登録する(後述)
- [レビュー]で内容を確認し、承認のチェックを入れて[送信]ボタンを押す。ベースモデルにはVASA-1が表示されていました
- [カスタマイズ]の一覧で、ジョブの状態が[成功]になったらプレビューできる(手順4の画面の一覧)
なお、この画面は以前「微調整(Fine-tune)」の中にあり、2026年10月時点の公式手順では[Services]>[Customizations]になっていました。2026年11月時点では、[サービス]>[Speech]>[Custom models]タブの中にあります。
画像の与え方
手順6の[データ ソースの選択]では次の2つから選べます。
- [画像を使用して作成]:写真をアップロードする(
.jpg/.jpeg/.png)か、Foundryにアップロード済みの写真を選ぶ。新しい写真は[データのアップロード]から追加する - AIで作成(英語のUIではCreate with AI):年齢・性別・スタイルなどを指定し、欲しいキャラクターを文章で説明してGenAI画像モデルに生成させる。同意の手順は飛ばされる(生成されたアバター画像は作成成功後の詳細画面で確認する)
画像には次の要件があります。
- 写真アバターは頭部のみを扱うため、肩から上が写った画像が望ましい
- 顔は実在の人間または仮想人間に見えること。目が極端に大きいなど、アニメ調の特徴は非対応
- 派手なアクセサリーやジュエリーは避ける
- 頭部が完全に写っており、正面を向いていること
- 影や隠れた部分がないこと
実写の場合の同意動画
実在の人物の写真から作る場合、その人物の同意が必要です。具体的には、同意書を読み上げている動画をアップロードします。Microsoft側で、読み上げ内容が所定のスクリプトと一致するか、動画の顔と写真が同一人物かを検証します。自分の顔で作る場合も、この動画は必要です。
同意文のサンプルは、Azure-Samples/cognitive-services-speech-sdkリポジトリのverbal-statement-all-locales.txtにあります。
動画の条件は次のとおりです。
| 項目 | 条件 |
|---|---|
| 形式 |
.mp4または.mov
|
| サイズ | 500 MB未満 |
| 長さ | 3秒より長く、1分より短い |
手順7の[アバター タレントの登録]では、登録済みの話者を選ぶか、[アバター タレントの追加]から新しく登録します。一度登録した話者は、次のアバター作成で再利用できます。
[アバター タレントの追加]では、話す言語、アバター タレント名、会社名を、動画の中で読み上げたとおりに、同じ言語で入力します。入力すると、読み上げる同意文が画面に表示されます。
用意するのは動画です(1分未満)。実際の作成画面も動画のアップロードになっているので、カスタム写真アバターの作成手順のページに沿って準備してください。
AIが生成したキャラクターから作る場合は、実在の人物ではないため同意動画は不要です。手順を通しで試したいだけなら、こちらが手軽です。
アバターの設定
photo avatarとvideo avatarの設定項目の違い
同じ「アバター」でも、指定するフィールドがかなり違います。video avatarのサンプルを流用すると噛み合わないので、差分を整理します。
| 項目 | Photo Avatar | Video Avatar |
|---|---|---|
| 元になるもの | 静止画1枚をvasa-1 / vasa-2が動かす |
撮影済みの動画 |
model |
必須(vasa-1またはvasa-2) |
不要 |
crop |
不要 | 指定が必要(全身から話者を切り出す) |
video.resolution |
効かない | 効く |
style |
標準キャラはすべてN/A | スタイルを持つものがある |
scene(zoom / position / rotation / amplitude) |
photo avatar専用 | 無し |
| 映る範囲 | 頭部のみ | 全身のものもある |
特に間違えやすいのがvideo.resolutionです。1920x1080を指定してもそのとおりには届かず、元画像のアスペクト比(縦長のヘッドショット)のまま返ってきます。
session.updateでアバターを指定する
Voice Live APIはWebSocket上でイベントをやり取りします。接続してセッションが開いたら、クライアントからsession.updateを送ってセッションの設定を渡します。アバターの指定は、そのsessionオブジェクトのavatarに書きます。
カスタム写真アバターなら次のようになります。typeにphoto-avatar、modelにベースモデルのvasa-1を指定します。
{
"type": "session.update",
"session": {
"avatar": {
"type": "photo-avatar",
"model": "vasa-1",
"character": "my-avatar",
"customized": true,
"output_protocol": "webrtc",
"video": {
"bitrate": 2000000,
"codec": "h264",
"background": { "color": "#FFFFFFFF" }
}
}
}
}
標準video avatarの例と見比べると、typeとmodel以外に、styleとcropを書かない点が違います。
このsession.updateを送り、サーバーからsession.updatedが返ってくれば設定は適用されています。アバターの映像は、output_protocolがwebrtcならWebRTCのメディアストリームで、websocketならresponse.video.deltaイベントとして届きます。受け取り方の違いは次回(第7回)で扱います。
customizedの指定
自作アバターを指定するときは、customizedにtrueを指定します。
標準キャラと自作アバターは名前空間が分かれていて、自作アバターの名前をcustomizedなしで送ると、サービスは標準キャラの中から探しにいって見つけられません。このとき返るのは、フィールドがすべてnullの空のエラーです。メッセージが空なので原因が分からず、「アバター名は合っているのにエラーになる」という状態になります。逆に、customized: trueを立てたまま標準キャラの名前を指定した場合も、カスタム側の名前空間に存在しないため同じことが起きます。
このため実装側では、指定された名前が標準キャラクターの一覧に含まれるかどうかでcustomizedを自動的に決めておくと、利用者にフラグを意識させずに済みます。
SDK 1.2.0で書く場合
SDK 1.2.0では、photo avatarの設定をすべて型で書けます。
bool customized = !StandardTalkingHeads.Contains(character.ToLowerInvariant());
options.Avatar = new AvatarConfiguration(character, customized)
{
AvatarKind = AvatarConfigKind.PhotoAvatar, // type: photo-avatar
BaseMode = PhotoAvatarBaseMode.Vasa1, // model: vasa-1
Video = new VideoParams
{
Bitrate = 2000000,
Codec = "h264",
Background = new VideoBackground { Color = "#FFFFFFFF" }
}
};
StandardTalkingHeadsは標準キャラクターの名前の集合で、上で書いた「名前からcustomizedを決める」をそのまま実装しています。標準キャラクターが34体に増えたので、この集合も追従させる必要があります。
SDK 1.2.0のPhotoAvatarBaseModeにはvasa-2の列挙子がなく、用意されているのはVasa1だけです(DLLを確認してもvasa-1の文字列しか入っていません)。
ただし、この型は文字列を受け取るコンストラクタを持っているので、次のように書けばvasa-2も渡せます。
options.Avatar.BaseMode = new PhotoAvatarBaseMode("vasa-2");
将来SDKが追いつけばPhotoAvatarBaseMode.Vasa2になるはずです。
sceneで大きさと位置を調整する
photo avatarだけの設定として、sceneで映り方を調整できます。
"avatar": {
"type": "photo-avatar",
"model": "vasa-1",
"character": "sakura",
"customized": false,
"scene": {
"zoom": 0.8,
"position_x": 0,
"position_y": 0.05,
"amplitude": 0.8
}
}
| 項目 | 意味 | 実機で確認したこと |
|---|---|---|
zoom |
拡大・縮小 | 実質0〜1。1より小さいと縮小(0.5で肩まで入る)。1.0・1.2・2.0は見分けがつかなかった |
position_x / position_y
|
位置(フレームに対する割合、-1〜1) |
position_yは正の値で下に動く |
rotation_x / _y / _z
|
回転(ラジアン) | ― |
amplitude |
頭の動きの大きさ(0〜1) | 1より小さいと動きが控えめになる |
zoomの詳しい挙動は、後の「実機検証」に書きます。
声と組み合わせる
声も同じsessionの中の設定項目です。avatarとは別のキーなので、両者は独立して設定できます。組み合わせるときは、単に両方を書きます。
{
"type": "session.update",
"session": {
"avatar": {
"type": "photo-avatar",
"model": "vasa-1",
"character": "my-avatar",
"customized": true
},
"voice": {
"type": "azure-personal",
"name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "DragonLatestNeural"
}
}
}
標準アバターに自分の声を当てる、といった組み合わせもできます。
カスタムvideo avatarの声(avatar-sync voice)
カスタムvideo avatarには、アバターを撮影したときの収録から学習した声を使うavatar-sync voiceがあります。見た目と声が同じ人物から作られます。photo avatarでは使えません。
{
"type": "session.update",
"session": {
"avatar": {
"type": "video-avatar",
"character": "<カスタムアバター名>",
"customized": true,
"style": "<スタイル>"
},
"voice": {
"type": "avatar-voice-sync",
"model": "DragonHDOmniLatestNeural"
}
}
}
声はアバターの側から取られるので、voiceには名前を書かず、ベースモデルだけを指定します。アバター名はavatar.characterに入れます。
実機検証
sceneのzoom
sceneのzoomを0.5 / 1.0 / 1.2 / 2.0で試したところ、1未満は期待どおり縮小しましたが、1を超える値は1.0と見分けがつきませんでした。Speechのリアルタイム合成アバターのドキュメントも範囲を「0〜1」としており、実際の見え方はこちらに一致します。zoomは縮める方向にだけ効くようです。
寄りの構図にしたい場合はzoomではなく、photo avatarはcropを使わず元画像がすでにバストアップであることを前提に、元の写真の構図で決めるほうがよさそうです。
カスタムvideo avatarを使うまで
カスタムvideo avatarは、実機で使えるまでにいくつかの点で止まりました。
まずSDK 1.2.0で声を設定したところ、アバター名がモデル名として送られていました。AzureAvatarSyncVoiceのコンストラクタが受け取るのはベースモデル(PersonalVoiceModels)ですが、PersonalVoiceModelsは文字列から暗黙に変換できるため、アバター名を渡してもコンパイルが通ってしまいます。サンプルも最初これで失敗していたので、ベースモデルを渡すように直しました。
次に、アバターをデプロイするリソースです。カスタムvideo avatarは、Voice Liveを呼ぶのと同じFoundryリソースにデプロイする必要があり、別リソースのアバターは使えません。学習とデプロイでリージョンが違うならCopy toでコピーします。コピー先がvoice sync非対応のリージョンだと声が消えます。
モデルのリージョンにも制限がありました。invalid_model: Model gpt-4o is not supported in this regionで失敗した場合は、リージョンがgpt-4oに対応していません。Voice Liveのリージョン表ではcanadacentral / canadaeast / southeastasia / westcentralusがgpt-4o非対応なので、gpt-4.1などに切り替えます。
最後に料金です。photo avatarと違い、カスタムvideo avatarはデプロイしている間ホスティング料金がかかり続けます。デプロイと削除はポータルからのみなので、試したらすぐ削除するようにしてください。料金の目安(2026年9月時点)は、ホスティングが¥95.6/時間、リアルタイムアバターのセッションが別に¥95.6/分、学習が¥2,389.8/計算時間でした。
私が検証した際、学習は30.3計算時間(体感では約10時間)かかっています。撮影のコストに加えて、学習と維持のコストもphoto avatarよりかなり高くなります。
まとめ
- Voice Live APIのアバターは、標準video・標準photo・カスタムphoto・カスタムvideoの4パターンで、申請が要るのはカスタムの2つです
- 標準photo avatarは申請なしで使えますが、キャラクターごとにベースモデルが決まっています
- 2026年12月にJeffとLisaの一部のスタイルが廃止されます
- アバターは使えるリージョンが限られ、日本のリージョンは対象外です
- カスタムphoto avatarはFoundryのSpeech(Custom models)から作り、デプロイ操作は要りません
- Voice Live側では
session.updateのavatarを書き、voiceと組み合わせられます - 自作アバターを指定するときは
customizedをtrueにします - カスタムvideo avatarは同じリソースへのデプロイが必要で、デプロイ中は課金が続きます
声の側は別記事にまとめています。
次回(第7回)は、アバターの映像をWebSocketで受けるかWebRTCで受けるかを扱います。


