エージェントを自分の声でしゃべらせてみたいw
生成AIの最近の進化によっていろいろなことができるようになっています。チャットで様々な作業をさせることは日常的に活用されていますし、画像や動画といったクリエイティブな面も。
そして、自身の声や写真で生成AIをファインチューニングすれば、自分の声でアバターに話をさせることも可能です。こういった技術はディープフェイクを含め様々な問題にもつながる技術ではありますが、エージェントのインタフェースの1つとして注目する要素でもあると思います。
Microsoft Foundry の Personal Voice を使うと、短い音声サンプルから自分の声を再現できます。作った声は Voice Live API のセッションに指定でき、リアルタイム音声対話をそのまま自分の声にできます。Foundryで利用できるサービスでは音声モデルのクオリティに応じていくつかのチューニング方法が提供されています。
| Personal Voice | プロフェッショナル音声 | |
|---|---|---|
| 必要なデータ | 1分間のスピーチ | 300〜2,000 発話(約30分〜3時間) |
| 想定シナリオ | ユーザー自身の声をアプリで使う | ブランド音声、キャラクター音声、読み上げコンテンツ |
| 多言語 | 100超のロケール・91言語。言語の自動検出あり | クロス言語機能の選択が必要 |
本記事では、Personal Voice を実際に作成し、Voice Live APIを使ってエージェントをオリジナルの音声で対話できるようにしたときの話を記事にしています。記事の中では利用申請 → 作成 → コードから呼び出しの3段を順に説明します。Foudryにはこれ以外にアバターをカスタムする方法も提供されています。手順はよく似ているのですが、利用する機能は別になるためカスタムアバターについては別記事にまとめる予定です。
検証に使ったコードはこちらで公開しています。
カスタム音声モデルをFoundryでつくる
カスタム音声を作るためにはいくつかの作業が必要になります。大きくは以下の手順になります。
- Microsoft Foundryのリソースを準備する
- 利用申請を行う
- Foundryでカスタム音声モデルを構築する
- 実際に利用する
Microsoft Foundryのリソースを準備する
最初にリソースを準備します。注意点としてはpersonal voiceは限定された機能で現時点では使えるリージョンが限定されています。リソース作成時にはリージョンを間違えないように。
Microsoft Foundryは実際にエージェントの利用や、音声会話といったサービスを利用した時に課金される従量課金のサービスです。Foundryそのもののリソースを構築したり、モデルデプロイしただけでは課金されることはありません。例えばこのためだけに別リージョン環境を構築するといったことも可能です。
次に実際にカスタム音声モデルを構築するための申請を行います。実はこれが一番の関門になっています。
利用申請(Limited Access)を行う。
かなり利用制限が掛かっている機能なので簡単には使えないです
Personal Voice は Limited Access 機能です。申請して承認されないと使えません。最初に少し話したように、カスタム音声モデル、カスタムアバターに関する機能はその特徴から利用を厳しく制限している状況にあります。Microsoftでは利用用途と機能、身元に関する情報を提出し審査を受ける必要があります。
申請が可能なのは、「Microsoft のアカウントチームが直接担当している顧客のみ」 に限定されており、かつ組織メールアドレスでの申請のみ受け付けています。
つまり、個人が気軽には使えないようになっている形です。ディープフェイク等の悪用含めてかなり慎重に機能を提供している状況といえると思います。
申請先はこちらです。
承認される利用範囲は、申請時に選んだユースケースに限定されます。
審査に通れば、Microsoft FoundryまたはSpeech Studioでカスタム音声モデルを生成することができるようになります。
このフォームは Personal Voice とカスタムアバターで共通ですが、申請は機能ごとに出す必要があります。別記事で紹介予定ですが今回 Personal Voice とアバターで計2回提出しています。また、同じ機能でも利用目的が異なる場合は別途申請が必要です。
自分の声を作る
承認されたら、実際に構築することができます。カスタム音声モデルを利用できるリージョンに作成したFoundryのプロジェクトを開いた状態から作業を進めてきます。
- [ビルド]-[サービス]を選択し、表示されたサービスから[カスタマイズ]タブを選択し、[作成]ボタンを押して新規作成を始めます。
- モデルの選択で[Azure Speech - Text to Speech]を選択する
- 種類で[パーソナル音声]を選択し、音声名と説明(任意)を入力し[次へ]ボタンを押す
- ボイスタレントの選択で[ボイスタレントの追加]を押す(データのアップロードでも作成は可能)
- ボイスタレントの追加を押すと、データの録音ダイアログが表示されます。言語、ボイスタレント名、会社名を入力し、下部に表示される文章を読み上げて音声を録音します。この録音は同意を兼ねているようです。録音が完了し保存後に[次へ]ボタンを押す
- トレーニングデータを追加します。事前に録音したものをアップロードするかその場で録音して登録も可能です。

- 最後に同意事項をチェックして送信するとモデルが生成されます。

Personal Voice は「すべての音声が本人の明示的な同意のもとに作られること」を前提にした機能なので、上記の手順は省略できません。
数分で構築される
私が作ったときは30秒ほどのトレーニングデータを用意してファインチューニングを実施しました。
できあがった音声は、100を超えるロケール・91言語で合成できます。ロケールタグは不要で、文単位で自動的に言語を判定します。
実際に使ってみる
とりあえず作った音声モデルを試したい場合は、プレイグラウンドから対話することが可能です。音声の選択でAzure Speechのカスタムを選択すると先ほど作ったパーソナル音声が選択できます。この状態でリアルタイム音声会話が利用できます。

もちろん、Voice Live APIをつかってアプリケーションの中でカスタム音声モデルを利用することができます。が、1点だけ注意点があります。それが音声モデルの指定方法です。
最大の落とし穴: 話者プロファイル ID が見つからない
ここが本記事で最も伝えたい部分です。
API仕様を見るとカスタム音声モデルを指定する場合は項目 name に入れることになっています。一見nameなのでパーソナル音声名かと思いきや実は、サービスが生成した話者プロファイル ID(GUID) です。ポータルでは以下の情報が見えていますが。。。
- voice 名
- ポータルに表示されている「プロファイル ID」
いずれも同じエラーで弾かれます。
you don't have access to this personalVoiceName or it's not available
正しい GUID は、ポータルの personal voice ページの URL からしか取得できません。画面上のどの項目にも表示されないため、知らないと延々と詰まります。
パーソナル音声で作ったものを開いたときにURLは以下のようになっています。nameに設定すべき値は太字部分のGUIDです。
https:// ai.azure.com/nextgen/r/XXXXXXXXXXXg,xxxxxxxxx-ai,,xxxxxxx-env,xxxxxxxxx-env-proj/build/services/finetune-details/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/details?tid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&type=personalVoice
公式ドキュメントは name を "Voice name" と説明しており、how-to の例も "your-personal-voice-name" と書かれています。この記述に従うと動きません。 ブラウザのアドレスバーに出ている GUID を使ってください。
session.update でカスタム音声を指定する
Voice Live API は WebSocket 上でイベントをやり取りします。接続してセッションが開いたら、クライアントから session.update を送ってセッションの設定を渡します。ここで渡す session オブジェクトの中に voice があり、カスタム音声を使うために設定が必要なのはここだけです。
既定ではプリセットの音声が指定することがおおい項目です。
{
"type": "session.update",
"session": {
"voice": {
"type": "azure-standard",
"name": "ja-JP-Nanami:DragonHDLatestNeural"
}
}
}
これをカスタム音声に差し替えます。
{
"type": "session.update",
"session": {
"voice": {
"type": "azure-personal",
"name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "DragonLatestNeural"
}
}
}
指定するのは3つです。
| フィールド | 内容 |
|---|---|
type |
azure-personal 固定 |
name |
話者プロファイル ID(GUID)。前述のとおり URL から取得したもの |
model |
必須。DragonLatestNeural / DragonHDOmniLatestNeural / MAI-Voice-1 から選ぶ |
プリセット音声との違いは、type を変えることと、model が必須になることです。model はベースになる音声モデルの指定で、同じ話者プロファイルでもモデルを変えると印象が変わります。
実際のセッション設定は、これ以外にモダリティやターン検出などを含んだ形になります。全体としてはこうなります。
{
"type": "session.update",
"session": {
"modalities": ["text", "audio"],
"input_audio_format": "pcm16",
"output_audio_format": "pcm16",
"turn_detection": { "type": "server_vad" },
"voice": {
"type": "azure-personal",
"name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "DragonLatestNeural"
}
}
}
この session.update を送り、サーバーから session.updated が返ってくれば設定は適用されています。あとは通常どおり音声を送るだけで、返ってくる応答音声がカスタム音声モデルの声になります。カスタム音声のためにやることは、他には何もありません。
話者プロファイル ID が誤っている場合、エラーが返るのはこの session.update を送った時点です。会話を始めてから気づくわけではないので、前述の you don't have access to this personalVoiceName or it's not available が出たら、まず name の値を疑ってください。
アバターと組み合わせる
アバターも同じ session の中の設定項目です。voice とは別のキーなので、両者は完全に独立しています。組み合わせるときは、単に両方を書きます。
{
"type": "session.update",
"session": {
"voice": {
"type": "azure-personal",
"name": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"model": "DragonLatestNeural"
},
"avatar": {
"type": "photo-avatar",
"model": "vasa-1",
"character": "my-avatar",
"customized": true
}
}
}
特別な結び付けは不要で、任意の組み合わせが可能です。標準のアバターに自分の声を当てることも、自分の写真から作ったアバターに自分の声を当てることもできます。
まとめ
- Personal Voice は Limited Access。申請フォームはカスタムアバターと共通だが、申請は機能ごとに必要
- 作成時の同意の録音は省略できない
- 公式表記は1分だが、実際は30秒ほどの音声で作れた。
- Voice Live で使う場合はプロファイル IDが必要。voice 名でもポータル表示の「プロファイル ID」でもなく、URL に含まれる GUID を使う
- Voice Live 側でやることは
session.updateのvoiceを差し替えるだけ。type: azure-personalとname(GUID)、modelの3つ。avatarとは別のキーなので自由に組み合わせられる