【Unity】ドコモAIエージェントAPI SpeakSDKをAudioSource経由で音声出力する
はじめに
こちらの記事を参考にリップシンク(口パク)をしようとしていたところ、SpeakSDKの仕様変更にぶつかりました。この記事では最新のspeak-unity-sdk v1.14.5でリップシンクを行う方法を紹介したいと思います。
ドコモAIエージェントAPIを使ってキャラクターと会話する
環境
- Windows 10 Home
- Untiy 2019.3.13f1(推奨バージョンは2019.3.2f1)
- speak-unity-sdk v1.14.5
状況
初めの記事のバージョンではUnityのAudioSource上から出力されていた音声が、DLLなどネイティブプラグイン側から直接出力される仕様になっていました。こうなるとUnity側には音が流れない状態になるためAudioListenerで音を拾うことができないという状況が発生していました。
しかし、v1.14.5で下記の変更が入ったため、その方法を紹介します。
AudioSouceで合成音声が利用できるように機能追加
引用元:https://github.com/docomoDeveloperSupport/speak-unity-sdk/releases/tag/v1.14.5
SpeakSDKをAudioSource経由で音声出力する方法
サンプルのソースコードを元に紹介します。Editor上での動かし方はこちらの記事を参照してください。
【Unity】ドコモAIエージェントAPI SpeakSDKのサンプルをEditor上で実行する - Qiita
AudioSource経由で音声出力する方法は公式ユーザーガイドPDFの27ページ目辺りの6.3章で説明されています。具体的には初期化のタイミングでSetAudioSource()を呼び出せばいいそうです。
サンプルのSpeakSDKManager.csの場合、InitializeSpeakSDK()に下記の2行を追加してください。
private void InitializeSpeakSDK()
{
Speak.Instance().SetURL("wss://spf-v2.sebastien.ai/talk");
Speak.Instance().SetDeviceToken("c0ed13a0-0069-4c81-8dcb-397cdf60c9fa");
// 以下の2行を追加
var audioSource = GetComponent<AudioSource>();
Speak.Instance().SetAudioSource(audioSource);
// Callback.
Speak.Instance().SetOnTextOut(OnTextOut);
Speak.Instance().SetOnMetaOut(OnMetaOut);
}
また、SpeakSDKManagerがアタッチされているオブジェクトにAudioSourceコンポーネントを追加しておいてください。
これで、最初の記事の方法でリップシンクができるようになりました。
おまけ:SDKをアップデートする際の注意点
Unityでは一度でもスクリプトからNative Pluginをロードすると、Unityを再起動するまでUnloadされない仕様になっています。そのため、ロード済みの状態で.unitypackageを適用しようとすると、dllの上書きがされません。アップデート前にプロジェクトを再起動することで解決します。
参考:【Unity】Macで使えるNative Pluginを作る(OpenCV編) - おもちゃラボ
また、dllをアップデートするとEditorで使えるようにする設定もリセットされるのでご注意ください。
【Unity】ドコモAIエージェントAPI SpeakSDKのサンプルをEditor上で実行する - Qiita
謝辞
この記事を作成するにあたり、AIセバスちゃんさん (@SebasAi) にアドバイスをいただきました。ありがとうございました!
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">XR Kaigiの講演のスライドです!!
「音声対話エンジンを使った中の人がいないバーチャルキャラクターとその先の未来」<a href="https://twitter.com/hashtag/XRKaigi?src=hash&ref_src=twsrc^tfw">#XRKaigi</a><a href="https://t.co/ilYDlldAvA">https://t.co/ilYDlldAvA</a></p>— AIセバスちゃん (@SebasAi) <a href="https://twitter.com/SebasAi/status/1202870099981422592?ref_src=twsrc^tfw">December 6, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
最後に
宣伝ですが、 月額制のメンターサービスで初心者向けの開発サポートをしています。分からないことがあれば是非こちらで質問してください!
Discussion