画面のキャラクターが英語を話すとき、AI英会話の口の動きは、音とは別の経路で届いた数字から組み立てられている。
先に音を鳴らしておいて、それらしく口を開け閉めしているわけではない。
合成された音声には、どの瞬間にどの口の形になるのかを示す整数が、時刻つきで添えられている。
この整数を、日本語では口形素、英語では viseme と呼ぶ。
Microsoft Learn の公式ドキュメントは、この番号が全部で22種類しか用意されていないと書いている。
英語の音の数より、はるかに少ない。
この記事では、テキストから音声を合成する方法と口形素を使用して顔の位置を取得するの2枚を材料に、口が動くまでに何が届いているのかを開けていく。
サービスの順位づけはしない。
仕組みの話だけをする。
【結論】AI英会話の口の動きは、音声とは別に届く「番号と時刻」で決まる
結論から置く。
合成の出力に付いてくるのは、口の形を指す整数と、その形が始まる時刻の2点である。
公式ドキュメントはこの時刻を Audio offset と呼び、単位をティック、すなわち100ナノ秒で示すと説明している。
| 届くもの | 中身 | 画面側での使い道 |
|---|---|---|
| 口形素ID | 0から21までの整数 | どの口の形にするかを決める |
| Audio offset | その形が始まる時刻(ティック=100ナノ秒) | 音とずれない位置に置く |
Animation | SVGのXML文字列、またはブレンドシェイプのJSON文字列 | 2Dの絵、3Dの顔をそのまま動かす |
⇒ 口は音から推測されているのではなく、音を作る段階ですでに決まっている。
だから口の動きの質は、端末の性能でも回線の速さでもなく、音声合成の側の仕様で決まってくる。
AI英会話の口の動き①|合成中に届くイベントは7つあり、口形素はその1つ
音声合成は、音が全部でき上がってから丸ごと渡す処理ではない。
Speech SDK を使うと、合成が進むあいだに起きる出来事を購読できる。
公式の表に並んでいるのは、次の7つだ。
SynthesisStarted=合成が始まったことの通知。Synthesizing=進行中の通知。SDKがサービスからオーディオのかたまりを受け取るたびに発生する。SynthesisCompleted=合成が終わったことの通知。SynthesisCanceled=合成が取り消されたことの通知。BookmarkReached=SSMLに置いたbookmark要素に達したことの通知。その要素までの経過時間が報告され、印そのものは読み上げられない。VisemeReceived=口形素イベントを受け取ったことの通知。WordBoundary=単語の境目を受け取ったことの通知。
この7つのうち、口の動きに直接効くのは VisemeReceived と WordBoundary の2つになる。
前者は口の形を、後者はいま読んでいる位置を渡す役割を持つ。
残りの5つは、開始・進行・完了・取り消しという状態の知らせと、自分で置いた目印への到達通知だ。
AI英会話の口の動き②|22種類しかなく、音素と1対1では対応しない
ここが、口の動きをめぐっていちばん誤解されやすい部分だ。
公式ドキュメントは口形素を、話し言葉の音素を目に見える形で描いたものと定義している。
1つの口形素は、ある音素のまとまりに対応する代表的な頭の姿勢を表す、という説明が添えられている。
そのうえで、口形素と音素のあいだに1対1の対応は無いとはっきり書かれている。
理由として挙がっているのは、s と z のように、耳で聞けば違うのに話し手の顔が同じに見えてしまう組み合わせがあることだ。
| 口形素ID | 公式が代表例として並べているIPA音素 | 学習者から見た手がかり |
|---|---|---|
| 0 | 無音 | 口を閉じた待機の姿勢 |
| 1 | æ・ə・ʌ | あいまい母音がここに集まる |
| 6 | j・i・ɪ | 横に引く形 |
| 15 | s・z | 見た目が同じなので目で区別できない |
| 18 | f・v | 下唇と上の歯が触れる形 |
| 21 | p・b・m | 唇をいったん閉じる形 |
15番を見れば分かるとおり、口の形をいくら見ても s と z は見分けられない。
一方で18番のように、下唇を噛む形がはっきり現れる音もある。
発音練習で「口を見て真似れば直る音」と「口を見ても手がかりが無い音」が分かれるのは、この22への集約が理由になっている。
音素の側の表記そのものは、SSMLで発音を指定するドキュメントにある phoneme 要素で扱われ、alphabet に ipa を指定する書き方が例示されている。
AI英会話の口の動き③|2DはSVG、3Dは1フレーム55個の数字で来る
番号と時刻だけでは、絵は1ミリも動かない。
公式ドキュメントは、口形素の出力を口形素ID・SVG・ブレンドシェイプの3通りに分けている。
2Dのキャラクターでは、口形素IDごとにSVGを用意しておき、時間つきの顔の位置として受け取る作り方が示されている。
イベントに入っている時間のタグを使えば、用意した絵は滑らかにつながる、という説明が続く。
公式が例に挙げているのは、語学学習のために設計された赤い唇のキャラクターだ。
| 出力の形 | 実体 | 要求の仕方 |
|---|---|---|
| 口形素ID | 0から21の整数+Audio offset | イベントを購読するだけで届く |
| SVG | アニメーションを含むXML文字列 | SSMLで指定する。en-US ロケールのみ対応 |
| ブレンドシェイプ | 2次元行列で表されたJSON文字列 | SSMLで指定する |
3Dの場合に届くのは、絵ではなく数字の行列になる。
行列の1行が1フレームにあたり、1フレームは60FPSの刻みで、そこに55個の顔の位置の配列が入っている。
値は0から1の小数で、並び順も決まっており、まばたきや顎の開閉や唇のすぼめといった部位が順番に割り当てられている。
FrameIndex は、いま届いたフレームの一覧より前に何フレームあったかを示す値だ。
ここで分かるのは、口だけでなく目や顎まで同じ配列で運ばれているということで、表情つきのアバターはこの55個を受けて動いている。
AI英会話の口の動き④|SSMLに1行書かないと、絵のデータは来ない
既定のまま合成すると、届くのは番号と時刻だけだ。
SVGとブレンドシェイプを受け取るには、SSMLの mstts:viseme 要素を書く必要がある、と注記されている。
SSMLの構造を示した公式ドキュメントでも、この要素は voice の中に置ける要素の一覧に並んでいる。
同じページは、この要素の中にテキストもほかの要素も入れられないと書いている。
サンプルでは <mstts:viseme type='redlips_front'/> という1行が、読み上げるテキストの手前に置かれている。
加えて、SVGの対応は en-US ロケールだけだという注記も入っている。
- 番号だけでよいなら、イベントを購読するだけで足りる。
- 2Dの絵をそのまま受け取りたいなら、SSMLに1行足す。ただし対応ロケールは
en-USに限られる。 - 3Dの顔を動かしたいなら、同じくSSMLに1行足して、55個の配列を受け取る。
日本語の学習アプリで口の動きを出したい場合、この制約から、番号かブレンドシェイプを使う設計になる。
AI英会話の口の動き⑤|単語境界イベントは「いまどこを読んでいるか」を渡す
読み上げに合わせて文字の色が変わる仕掛けにも、公式の裏づけがある。
WordBoundary が発生するのは、新しい語・句読点・文それぞれの先頭だと書かれている。
そこで報告されるのは、出力音声の先頭から数えた現在の語までの時間で、単位はやはりティックだ。
さらに、これから読まれる語が入力テキストやSSMLのどの文字位置にあるかも一緒に渡される。
用途として公式が挙げているのは、語を強調表示する時刻と長さを決める材料にすることだ。
| イベント | 何を渡すか | 画面に出る形 |
|---|---|---|
VisemeReceived | 口形素IDとAudio offset、必要ならSVGかブレンドシェイプ | 口が開閉する |
WordBoundary | 語までの時間オフセットと、入力側の文字位置 | 読んでいる語の色が変わる |
BookmarkReached | 自分で置いた印までの経過時間と、印に付けた文字列 | 好きな地点で処理を差し込める |
サンプルコードでは、境目の種類として Punctuation・Sentence・Word の3つが分岐に並んでいる。
文の境目まで受け取るには、文境界を要求するプロパティ(RequestSentenceBoundary)を有効にしておく必要があると、コード側のコメントで指定されている。
⇒ 語の色が変わる機能と、文単位で区切って読み返す機能は、同じイベントの別の設定から来ている。
AI英会話の口の動き⑥|イベントは音より先に来る。ずれるのは同期の問題
公式ドキュメントは、この点を注記の形で先回りして警告している。
イベントが発火するのは出力オーディオが用意できた時点であり、それはスピーカーから実際に鳴るよりも早い、という内容だ。
そのため、ストリーミングと実時間を合わせるのは呼び出した側の責任だ、と明記されている。
ブレンドシェイプの説明にも同じ思想が出てくる。
3Dエンジンは、対応するオーディオのかたまりが鳴る直前に、各フレーム群を描画しなければならない、と書かれている。
⇒ 口と音がずれて見えるとき、疑うべきはイベントの遅れではなく、アプリ側の同期の作りになる。
先に情報が来る設計なので、遅らせるのは簡単でも、間に合わせるのは難しいという順序になっている。
AI英会話の口の動きが、学習者の画面に出てくる場面
仕様の話を、学習者の側に置き換えておく。
公式ドキュメントは、口形素の使いどころを列挙している。
- キオスク端末に置く、アニメーションの音声アシスタントを作る。
- 顔と口が自然に動くニュース映像で、視聴の体験を上げる。
- その場の内容をしゃべるゲームのアバターやマンガのキャラクターを作る。
- 語学の学習者が、単語と音素ごとの口の動作を理解する助けになる教育動画を作る。
- 聴覚に障碍のある人が、アニメーションの顔から音を視覚的に受け取る。
4つ目が、AI英会話の画面にいちばん近い用途だ。
単語と音素それぞれの口の動作を理解する、という書き方がされている点は見逃せない。
口の動きが、飾りではなく音素の視覚化として位置づけられているということだからだ。
人物の映像として出す場合は、テキスト読み上げアバターが、テキストを人が話すデジタル映像へ変換する仕組みとして用意されている。
AI英会話の口の動き|よくある質問
Q. 口の動きは、AIが音を聞いて推測しているのか。 A. していない。公式ドキュメントでは、音声出力に口形素IDとAudio offsetを付けられると説明されており、音を作る側から一緒に出てくる。
Q. 口の形は何種類あるのか。 A. 22種類と明記されている。
0番が無音で、21番が p・b・m のように唇を閉じる音にあたる。
Q. 口の形を真似すれば発音は区別できるのか。 A. 区別できない音がある。
s と z が同じ15番に入っているのは、両者で話し手の顔が同じに見えるからだと説明されている。
Q. 日本語でも2Dの口パクの絵は出せるのか。 A. SVGの対応は en-US ロケールのみと注記されている。
ほかの言語では口形素IDかブレンドシェイプを使う形になる。
Q. 口と音がずれるのは通信のせいか。 A. 通信とは限らない。
イベントは実際の再生より先に発生する仕様で、実時間との同期は呼び出した側が行うと書かれている。
まとめ|AI英会話の口の動きは「22の番号」と「ティックの時刻」でできている
もう一度、要点だけ並べる。
- 口の形は音声合成の出力に添えられて届く。推測ではなく、番号と時刻として渡される。
- 口形素は22種類。音素との対応は1対1ではなく、s と z のように見た目が同じ組み合わせがある。
- 絵として受け取るならSSMLに
mstts:visemeの1行が要る。SVGはen-USロケール限定。 - 3Dは1フレーム55個の数字で来る。口だけでなく目や顎も同じ配列に入っている。
- イベントは再生より先に発火する。ずれの責任は同期を書く側にあると公式が明記している。
⇒ AI英会話で口の動きを見るときは、「よくできた映像か」ではなく「番号と時刻をどう受け取り、どう合わせているか」で見る。
そこが分かれば、口が合わない理由も、真似できる音とできない音の差も、仕様の側から説明できる。
※本記事の一次ソースは、各公式ドキュメントを2026-09-20に取得した生テキストで確認した。
仕様は更新されるため、最新は各公式ドキュメントで確認してほしい。
読み上げの間・速さ・読み方の指定を公式仕様から分解した記事です。
読み上げの指定まで分解した記事
Comments