Unityを使ってVRでアレなゲームを作成しています。
VRのゲームってコントローラーで操作するのが結構煩わしいので、「音声認識で操作出来たらいいなー」などと思いいろいろ調べたことを備忘録程度に書きます。
やりたいこと/やったこと
Unity で Oculus Integration を使って Oculus Quest2 用のゲームを開発しています。
その際に喋った言葉を解析して操作をさせたいです。
喋った言葉を全部ひらがなに直すのは結構難しそうなので、簡易的に音素を取得して代用することにしました。
Oculus VR での音声認識に関して
まず前提として、Oculus Quest2 のVRゲームで音声認識(喋った言葉をひらがなに変換する)はどうも結構難しそうです。
以下参考にした記事など
-
UnityEngine.Windows.Speech
- よさげですがwindows端末でしか使えないようです。無念。
-
【Unity(C#)】OculusQuestでAndroidネイティブの音声認識機能を呼び出せるのか検証
- Androidの機能を使っているようです。こちらもよさげですがVRでは使えないという結論(自分では検証してないのですが、、、)
-
【Unity(C#)】Watson API × OculusQuestで音声認識
- 完全に音声認識できていますが、Watson APIでお金かかりそうなのと、そもそも今回そこまでたくさんの言葉を認識させるつもりはないので今回はスルー。次回作あたりで使うかも
ということで途方に暮れていましたが、「LipSyncって音素は取得できているみたいだし、これの数値直接取得したら何とかなるのでは?」と思ってやってみたら音素の取得自体は結構簡単でした。
LipSyncの音素取得
LipSyncの基本機能はデモシーン(Oculus > LipSync > Scenes > LipSync_Demo シーン)を参考にしました。
このシーンの中で重要なオブジェクトは InputType_Microphone で、僕のやりたいことはほぼここに詰まっているようです。
- OVRLipSyncContext
- マイクで取得した音声の音素を解析して、frameにぶち込みます。解析の細かい内容は不明。とりあえずframeを抜き出せば音素量が数値で取得できる。
- ご丁寧に GetCurrentPhonemeFrame という関数でほかのスクリプトから frame をそのまま取得させてくれる。
- OVRLipSyncContextMorphTarget
- OVRLipSyncContextのframeの内容を、SkinnedMeshRendererに反映して口の動きを制御する。
- 今回は誰かを喋らせるわけではなく、音素量を取得したいだけなので、特に必要ない。
というわけで、外から OVRLipSyncContext の frame を取得して音素を解析します。
自作スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LipSyncContextGetter : MonoBehaviour
{
private OVRLipSyncContextBase lipsyncContext = null;
OVRLipSync.Frame frame;
// Start is called before the first frame update
void Start()
{
lipsyncContext = GetComponent<OVRLipSyncContextBase>();
}
// Update is called once per frame
void Update()
{
// sil、PP、FF、TH、DD、kk、CH、SS、nn、RR、aa、E、ih、oh、ou
frame = lipsyncContext.GetCurrentPhonemeFrame();
for (int i = 0; i < 15; i++)
{
Debug.Log(frame.Visemes[i]);
}
}
}
今回はとりあえずここまで。
この方法で操作できたかどうかまた記事書く予定です。
せっかくだから前作のリンクを置きたいのだけど、QiitaってDLSiteのR18作品のリンクとか載せたら怒られるのかな、、、