はじめに
この記事は
https://qiita.com/toqkz/items/142c79aaa1d831cb5a52
の更新で、基本的な内容は元記事と同じです。
更新の経緯としては、少し前に備忘録として役に立ったので、せっかくなので最新情報に更新しようと思った次第です。
問題の再確認
uLipSyncを使って同時に3体以上のリップシンクを行うと、同時2体までは期待動作しても3体同時だと動作しなくなることがあります(※環境依存の場合もあります)
これはuLipSyncの問題でなく、AudioSource + OnAudioFilterReadが原因の可能性が高いです。
手元の環境では図のような状況でした。
ただ、図のような接続でも、AudioSourceを使わない運用(例えばリアルタイムのリップシンクに限定)なら動作します。
Unityだけの機能で実現するなら、Microphone + AudioClipクラスを使ってAudioClipからGetDataしてuLipSyncのOnDataReceivedに書き込めば × だった構成でも期待動作します。つまりオーディオインターフェースの数は関係なく、音声の取得経路に問題があり、
× Microphone + AudioSource + OnAudioFilterRead
○ Microphone + AudioClip + GetData
ということになります。
これで問題自体は回避できるんですが、リップシンク対象が3体、4体…と増えるとオーディオインターフェースも追加する必要があり、機材や物理的な接続の管理が煩雑になります。
そこでNAudio
ここで元記事にあるようにNAudioを使うことにします。
NAudioを使った場合、1台のオーディオインターフェースで複数のマイク入力を扱えるので、ハードウェアの構成はシンプルになります。注意点としてはオーディオインターフェースがマルチチャンネル入力やASIOドライバ対応していることです。
元記事ではZOOM LiveTrak L-8を使っていましたが、今回はZOOM Zoom LiveTrak L6max を使います。
入力数は手元のダイナミックマイクが3つしかなかったので、同時3入力でテストします。
事前にFL Studioで確認すると、ちゃんとスペック通り12入力確認できます。
IN1~4がマイク入力なので、今回はIN1~3を使うことになります。
検証
検証に使ったソフトウェアやライブラリのバージョンは表の通りです
| 名称 | バージョン |
|---|---|
| Unity | 6000.0.61f1 |
| NAudio | 2.0.2 |
| NAudio.core | 2.2.1 |
| NAudio.asio | 2.2.1 |
| NAudio.wasapi | 2.2.1 |
| NAudio.winmm | 2.2.1 |
| uLipSync | 3.1.4 |
| UnityChanSSU_URP | 1.0.5 |
NAudioはUnityに合わせて.NET Standard 2.1で動かすため、最新のものではありません。
実際動作させた結果はXの動画になります。
特にハマるポイントもなく期待動作しました。
検証とは関係ありませんが、せっかくなのでInspector表示は強化しています。
ボリュームバーを作るのが地味に面倒でしたね…
あとは元記事にも書いてありますが、音声データ取得はUnityのメインスレッドとは別スレッドなので、音声データをUnityに渡すところは注意しましょう。GCを気にするなら自前でSPSCなキューを作ればいいと思います。
最後に
数年後、また見直していたら更新します。




