Symptoms
- I want to develop an application with my Microphone device
- I cannot get real time audio playback from my Microphone input without latency occurring
Cause
You are unable to play back audio from a Microphone source in real time. You may be experiencing one of the following issues:
- During playback you can hear an inaudible chopped noise
- The audio recorded continues to play in an infinite feedback loop
- The audio heard during playback has a fair amount of latency and does not sound immediately.
Resolution
To ensure your Microphone audio plays back in real time:
- Firstly, you will need to set the microphone as an AudioClip and attach this AudioClip onto an Audio Source. You will need to set the audio to loop by checking the loop tick box in your Audio Source component in the Inspector. You will then be able to use the spectrum data off the Audio Source, rather than the Audio Listener.
- Secondly, you will need to attach a script to the Audio Source which tells Unity that the Microphone device to start recording an AudioClip. For this you will need to call Microphone.Start();
To control latency you will also need to call Microphone.GetPosition(); and choose your desired latency sample rate. If you want no latency you can set this to “0” samples before the audio starts to play. See the below script to see how this script is executed.
Please note that you need to add the permissions to the app (iOS, Android, Windows Phone, Web Player), to use the microphone. The permissions are added if you have a reference to UnityEngine.Microphone in your script.
However, on Android specifically, this feature is not strictly required as it breaks compatibility with Android TV.
More Information
For scripting reference to calling Microphone.Start(); then see this document here
For scripting reference to calling Microphone.GetPosition(); then see this document here
Limitations:
There are some limitations if you want to build a complex system such as a voice chat or something related to real-time, in that case, the suggestion is to use low-level libraries such as NAudio or frameworks for real-time communication like Agora or Dissonance and of course Vivox that is a Unity Technologies product.
Comments
12 comments
Following the instructions above, I still see latency of over 220 msec using the Microphone on Windows, Unity 5.4.1 (see image). Is that the expected minimum? I've tried disabling all effects, using both USB and line-in mics, and varying the sample size without success.
I'm trying to build a Unity app that allows users to sing through the speakers, but this delay makes singing impossible.
Any hints/samples/suggestions appreciated!
My code is as follows:
using UnityEngine;
using System.Collections;
[RequireComponent (typeof(AudioSource))]
public class MicrophoneOn : MonoBehaviour {
void Start ()
{
AudioSource audio = GetComponent<AudioSource>();
audio.clip = Microphone.Start(null, true, 100, 44100);
audio.loop = true;
while (!(Microphone.GetPosition(null) > 0)){}
Debug.Log("start playing... position is " + Microphone.GetPosition(null));
audio.Play();
}
Unity is not designed for real time mic management, so if you want to create a Karaoke game you can't use Unity internal microphone management.
Thanks, Pino. I thought so, though the text above (from Unity!) deceptively suggests that it CAN work:
"To ensure your Microphone audio plays back in real time..."
Hi Ted,
There will always be some inherent latency when processing audio. Depending on the platform(s) you are targeting this audio latency will occur at different rates.
Something you can do if you haven’t yet done so to improve audio latency is by reducing the DSP buffer size:
Set DSP Buffer Size to ‘Best Latency’
Hope this helps.
Andy
Hi Ted,
If you change your code to that, it is a lot faster and really great:
Snippet
( a Pity we cannot change the Microphone LengthSec to 0.1 something or another float, but it's quite nice already.)
yours
Max Aigner
(Signature: www.maxaigner.de )
Hi, this doesn't seem to be working in 2018, any suggestions?
This script used to work in unity 5.6 for my gearvr app.I updated to unity 2018.1.0f2 and the gearvr app freezes on a frame but headtracking continues to work.I know this script is the problem because when i uncheck it the app is working fine...Is there an alternative way to playback a mic in realtime in unity 2018?Thanks.
I just tried this script in 2018.3.0b5 Personal and it is working for me. I hear the slightly delayed sound in my headphones, so it works.
Some slight adjustments:
I didn't need to include any namespace - it just worked with Microphone,
Had to use Microphone.devices to get the name of my microphone (since Built-in Microphone didn't exist for my machine).
The problem in my occassion was caused by the permission request "Record audio" .Even if i had the reference UnityEngine.Microphone in my script it didnt ask for this permission when i was starting my app.I created a new project and copy pasted everything and now it asks for the permission "record audio" and everything works fine like before...
when first microphone is start how to stop for the 5 seconds
StartCoroutine(RecordVoice());
IEnumerator RecordVoice()
{
yield return new WaitForSeconds(5);
//Microphone.End(null);
}
@Megan I tested the codes on Mac and android platforms, there was a little latency on MAC which can satisfy my requirement, but on android platform the latency was longer, and the experience was bad,how to solve this?
A slightly more flexible implementation could be like that
(just save the code below as AudioSourceAssigner.cs and drag it into an empty gameobject)
Please sign in to leave a comment.