Gongonの雑記

INVERSUS大好きゲーマー

UTAUの口パクのクオリティを上げたい

はじめに

 UTAUのカバー曲をキャラクターに口パクさせたいことがある。調べてみると以下の記事でそのやり方が紹介されている。

km4osm.com

この記事の通りに試してみたところ口パクの挙動に不自然さを感じたのでいろいろと調べて改善してみた。

不自然さの正体

 リンク先で紹介されているツイート通りですが、USTからLABに変換したときの音素のラベルが母音のみだからです。例えば「パパイヤ」という歌詞があったとしてこれをLABに変換すると「ああいあ」になってしまいます。「p」は口を閉じないと出せないのでこの口の動きでは発音が不可能です。

改善その1

 調べてみたら、USTから子音の音素を維持したままLABに変換できるツールがありました。

qiita.com

リンク先の「配布場所」からgithubのページに飛び「oto2lab-2.2.6-exe.zip」をダウンロードし解凍します。バージョン等は変わってるかもしれません。oto2labGUI.exeを実行し、変換したいファイルをUST→INI→LABの順で変換します。出力されたLABファイルを確認すると子音の音素が残っていることが確認できると思います。ただ、これを素直にAviUtlに突っ込んでもまだ不自然さが残ります。

子音処理について

 PSDToolKitの子音処理についての説明をドキュメントから引用する。

PSD アニメーション効果

0 - すべて「ん」として処理する
1 - 口を閉じる子音以外は前の母音を引き継ぐ
2- 口を閉じる子音以外は前後の母音の形をより小さいもので補間

これを読んだ感じ12で上手くいきそうだけどやってみると上手くいかない。実際の挙動は1は「すべての子音は前の母音を引き継ぐ」で、2は「すべての子音は『ん』として処理する」でした(=0)。これについてはドキュメントで

準備オブジェクト

口パク準備 で *.lab ファイルを読んでいる時は参照可能な前後の音素が参照できません。

と述べられているので仕様だと思います。

1は改善前と実質的に同じ。2は適用すると「パパイヤ」の「ヤ」の発音前に口を閉じてしまうのでよろしくない。もっと極端な例を挙げれば「ははいや」が「パパイヤ」と同じ口の動きになってしまう。

改善その2

 つまり子音の種類によって口の動きを変えたいという話である。「p」の時は口を閉じて「h」のときは口を閉じない(=前の母音の形を引き継ぐ)という処理にしたい。 大きな方針として、
Luaスクリプトを書いてなんとかする
② LABファイルを編集する
の2つが思いついた。①については勉強不足ですぐにはできなかったので②を試す。具体的にはLABファイル内に現れる子音それぞれについて、その子音の口の形に近い母音に置き換えるという処理を行う。実際の割り当ては以下の通り。 割り当ては明確な基準に基づくものではなく私の感覚になってる。

pau : k g h y ky hy gy
(2021/6/10追記、pauは無音なので不適切でした。「前の母音の形を引き継ぐ」というのが所望する動作です)
割り当てなし : k g h y ky hy gy
e : s sh z t ts ch d j n ny r ry
N : m b p my by py
u : w

サクラエディタの置換機能で、
\s(s|sh|z|t|ts|ch|d|j|n|ny|r|ry)\n を 「 e\n」に
\s(m|b|p|my|by|py)\n を 「 N\n」に
\s(w)\n を 「 u\n」 に置換した1正規表現をオンにしようね)
 母音に置換をしない子音については、PSDToolKitの設定で子音処理を1にしていれば希望通り(前の母音の形を引き継ぐ)に動作する。

結果

 以上の改善をして簡単な比較してみた。大分不自然さが軽減されたように思う。

(2021/6/15追記) 簡単な紹介動画作りました www.youtube.com

問題点

 当然ながら実際は「s」と「e」は口の形が異なるが上記の手法だとその区別ができない。多分Luaスクリプトをいじいじすれば何とかなりそう。
 また、より精密な口パクを行うなら前後の音素を参照する必要がある。同じ「s」でも「朝(asa)」の「s」と「明日(asu)」の「s」では口の形が異なる。後者は「会う(au)」と口の動きがほぼ同じなので、前の母音の形を引き継ぐような処理にするのが良さそう。となるともう少し丁寧なLABファイルの編集が必要となる。気が向けばそのうち試してみるかも。

おわりに

モチベがあればさらに改善したり丁寧に比較したりする動画を挙げると思います。
TwitterなりYouTubeなりでフォロー等するといいことがあるかもしれません。


  1. バッククォートで右項を囲ったら先頭の半角空白が消えたので仕方なく鉤括弧で囲った