Forum Discussion
YanaArtis
5 years agoProtege
Recording sound from mic during Oculus LipSync.
I use Oculus LipSync in my application for Quest and Rift. Articulation works fine. I can record facial blendshapes with my code and then playback the recorded articulations via C# code later. Now I ...
- 5 years ago
I have found the solution working on Rift and Quest:
// I have created my own class OculusLipSyncMicInput, copied into it source code from // Oculus' OVRLipSyncMicInput.cs, and made several modifications: public class OculusLipSyncMicInput : MonoBehaviour { ... private int _micNdx = 0; private AudioClip _recordedClip; private AudioClip _croppedClip; private bool _isRecordingSpeech = false; ... void Start() { audioSource.loop = true; audioSource.mute = false; bool micSelected = false; _micNdx = 0; if (Microphone.devices.Length > 1) { for (int i = 0; !micSelected && (i < Microphone.devices.Length); i++) { if (Microphone.devices[i].ToString().Contains("Rift")) { _micNdx = i; micSelected = true; } } for (int i = 0; !micSelected && (i < Microphone.devices.Length); i++) { if (Microphone.devices[i].ToString().Contains("Oculus")) { _micNdx = i; micSelected = true; } } } InitializeMicrophone(); } ... private void InitializeMicrophone() { if (initialized) { return; } if (Microphone.devices.Length == 0) { return; } // selectedDevice = Microphone.devices[0].ToString(); // Oculus' code selectedDevice = Microphone.devices[_micNdx].ToString(); // My code micSelected = true; GetMicCaps(); initialized = true; } ... // public void StartMicrophone() // Oculus' code public void StartMicrophone(int soundLenSec = 1) // My code { if (micSelected == false) return; //Starts recording // audioSource.clip = Microphone.Start(selectedDevice, true, 1, micFrequency); // Oculus' code audioSource.clip = Microphone.Start(selectedDevice, true, soundLenSec, micFrequency); // My code Stopwatch timer = Stopwatch.StartNew(); // Wait until the recording has started while (!(Microphone.GetPosition(selectedDevice) > 0) && timer.Elapsed.TotalMilliseconds < 1000) { Thread.Sleep(50); } if (Microphone.GetPosition(selectedDevice) <= 0) { throw new Exception("Timeout initializing microphone " + selectedDevice); } // Play the audio source audioSource.Play(); } ... // And I added several methods at the end public void StartMicrophoneRecord (int soundLenSec) { StopMicrophone(); StartMicrophone(soundLenSec); _isRecordingSpeech = true; } public void EndMicrophoneRecord () { int recordedSamples = Microphone.GetPosition(null); _recordedClip = (audioSource == null) ? null : audioSource.clip; StopMicrophone(); if (_isRecordingSpeech) { if ((audioSource == null) || (audioSource.clip == null)) { _recordedClip = null; } else { float[] croppedData = new float[recordedSamples * _recordedClip.channels]; _recordedClip.GetData(croppedData, 0); if (_croppedClip != null) { _croppedClip.UnloadAudioData(); Destroy(_croppedClip); } _croppedClip = AudioClip.Create(_recordedClip.name, recordedSamples, _recordedClip.channels, _recordedClip.frequency, false); _croppedClip.SetData(croppedData, 0); } _isRecordingSpeech = false; } StartMicrophone(1); } public AudioClip GetMicrophoneRecord () { return _croppedClip; } public void Mute () { micInputVolume = 0; } public void Unmute () { micInputVolume = 100; } }
jynxiwin
5 years agoExplorer
Thank you. I am doing something similar and getting 10 seconds of silence in a .wav I'm saving. Are you creating a file with this voice data?
YanaArtis
5 years agoProtege
I have found the solution working on Rift and Quest:
// I have created my own class OculusLipSyncMicInput, copied into it source code from
// Oculus' OVRLipSyncMicInput.cs, and made several modifications:
public class OculusLipSyncMicInput : MonoBehaviour
{
...
private int _micNdx = 0;
private AudioClip _recordedClip;
private AudioClip _croppedClip;
private bool _isRecordingSpeech = false;
...
void Start()
{
audioSource.loop = true;
audioSource.mute = false;
bool micSelected = false;
_micNdx = 0;
if (Microphone.devices.Length > 1)
{
for (int i = 0; !micSelected && (i < Microphone.devices.Length); i++)
{
if (Microphone.devices[i].ToString().Contains("Rift"))
{
_micNdx = i;
micSelected = true;
}
}
for (int i = 0; !micSelected && (i < Microphone.devices.Length); i++)
{
if (Microphone.devices[i].ToString().Contains("Oculus"))
{
_micNdx = i;
micSelected = true;
}
}
}
InitializeMicrophone();
}
...
private void InitializeMicrophone()
{
if (initialized)
{
return;
}
if (Microphone.devices.Length == 0)
{
return;
}
// selectedDevice = Microphone.devices[0].ToString(); // Oculus' code
selectedDevice = Microphone.devices[_micNdx].ToString(); // My code
micSelected = true;
GetMicCaps();
initialized = true;
}
...
// public void StartMicrophone() // Oculus' code
public void StartMicrophone(int soundLenSec = 1) // My code
{
if (micSelected == false) return;
//Starts recording
// audioSource.clip = Microphone.Start(selectedDevice, true, 1, micFrequency); // Oculus' code
audioSource.clip = Microphone.Start(selectedDevice, true, soundLenSec, micFrequency); // My code
Stopwatch timer = Stopwatch.StartNew();
// Wait until the recording has started
while (!(Microphone.GetPosition(selectedDevice) > 0) && timer.Elapsed.TotalMilliseconds < 1000)
{
Thread.Sleep(50);
}
if (Microphone.GetPosition(selectedDevice) <= 0)
{
throw new Exception("Timeout initializing microphone " + selectedDevice);
}
// Play the audio source
audioSource.Play();
}
...
// And I added several methods at the end
public void StartMicrophoneRecord (int soundLenSec)
{
StopMicrophone();
StartMicrophone(soundLenSec);
_isRecordingSpeech = true;
}
public void EndMicrophoneRecord ()
{
int recordedSamples = Microphone.GetPosition(null);
_recordedClip = (audioSource == null) ? null : audioSource.clip;
StopMicrophone();
if (_isRecordingSpeech)
{
if ((audioSource == null) || (audioSource.clip == null))
{
_recordedClip = null;
}
else
{
float[] croppedData = new float[recordedSamples * _recordedClip.channels];
_recordedClip.GetData(croppedData, 0);
if (_croppedClip != null)
{
_croppedClip.UnloadAudioData();
Destroy(_croppedClip);
}
_croppedClip = AudioClip.Create(_recordedClip.name, recordedSamples, _recordedClip.channels, _recordedClip.frequency, false);
_croppedClip.SetData(croppedData, 0);
}
_isRecordingSpeech = false;
}
StartMicrophone(1);
}
public AudioClip GetMicrophoneRecord ()
{
return _croppedClip;
}
public void Mute ()
{
micInputVolume = 0;
}
public void Unmute ()
{
micInputVolume = 100;
}
}
Quick Links
- Horizon Developer Support
- Quest User Forums
- Troubleshooting Forum for problems with a game or app
- Quest Support for problems with your device