Movement speed based on audio input

Hey all,

I am trying to use a mic input to control the movement speed of a character which I have managed to get working however my problem is that when I set the AudioSource to mute (because I don’t want the player to hear their own voice played back to them) then I no longer get a return value.

I was wondering if anyone knew a way to set the AudioSource to mute but still return some values in regards to the input. I have tried to set the volume to 0 and have it unmuted but that didn’t work either.

Here is the code I am using:

    private AudioSource audioSource;

    public float loudness;
    public float sensitivity;

    [Range(0, 100)]
    public float sourceVolume = 100;

    private string selectedDevice;

    void Awake()
    {
        audioSource = GetComponent<AudioSource>();
        audioSource.mute = false;
        audioSource.loop = true;
        selectedDevice = Microphone.devices[0].ToString();
    }

    public void StartMicrophone()
    {
        audioSource.clip = Microphone.Start(selectedDevice, true, 10, 44100);
        while (!(Microphone.GetPosition(selectedDevice) > 0)) { } 
        audioSource.Play();
    }


    void Update()
    {
        audioSource.volume = (sourceVolume / 100);
        loudness = GetAveragedVolume() * sensitivity * (sourceVolume / 10);
        if (!Microphone.IsRecording(selectedDevice))
        {
            StartMicrophone();
        }
            
    }


    float GetAveragedVolume()
    {
        float[] data = new float[256];
        float a = 0;
        GetComponent<AudioSource>().GetOutputData(data, 0);
        foreach (float s in data)
        {
            a += Mathf.Abs(s);
        }
        return a / 256;
    }

I implemented a game for the birthparty of my son which included steering a spaceship with miro input (higher volume => spaceship flies higher).
I didn’t had the issue you mentioned (hearing what you record), but i am also wondering why you use the method AudioSource.Play() in line 23 …

Here’s my the class from my game for the mic input:

using UnityEngine;
using System.Collections;

public class MicrophoneVolumeMeter : MonoBehaviour {
		public float timeForVolumeCalcInSeconds = 0.3F;
		private AudioClip audioclip;
		private AudioSource audioSource;
		private float timeLastVolumeWasTaken = 0;
		private float lastVolume = 0;

		// Use this for initialization
		IEnumerator Start () {
				yield return Application.RequestUserAuthorization (UserAuthorization.WebCam | UserAuthorization.Microphone);

				if (Application.HasUserAuthorization (UserAuthorization.Microphone)) {
						foreach (string device in Microphone.devices) {
								Debug.Log ("Microphone name: " + device);
						}
						if (Microphone.devices.Length == 0) {
								Debug.LogError ("No Microphones available!");
						} else {
								audioSource = gameObject.AddComponent ("AudioSource") as AudioSource;
								if (audioSource == null) {
										Debug.LogError ("audioSource is null!!!!");
								}
						}
				} else {
						Debug.LogError ("User gave no access to his microphones!");
				}
		}
	
		// Update is called once per time unit (normally 0.2 seconds)
		void FixedUpdate () {
				if (audioSource != null) {
						if (!Microphone.IsRecording (null)) {
								audioSource.clip = Microphone.Start (null, false, 1, 44100);
						} else {
								if (Time.fixedTime - timeLastVolumeWasTaken > timeForVolumeCalcInSeconds) {
										timeLastVolumeWasTaken = Time.fixedTime;
										float[] samples = new float[audioSource.clip.samples * audioSource.clip.channels];
										audioSource.clip.GetData (samples, 0);
										lastVolume = Mathf.Round (calculateAverageVolume (samples) * 10000F) / 100F;
										Debug.Log ("Time: " + Time.fixedTime + " / average volume * 100F = " + lastVolume);
										Microphone.End (null);
								}
						}
				}
		}

		/// <summary>
		/// Calculates the average volume of the given samples
		/// </summary>
		/// <returns>The average volume.</returns>
		/// <param name="samples">Samples.</param>
		private float calculateAverageVolume (float[] samples) {
				float sum = 0;
				for (int i=0; i < samples.Length; i++) {
						sum += samples  _* samples *;	// sum squared samples*_

* }*
* return Mathf.Sqrt (sum / samples.Length); // rms = square root of average }*
* }*

* ///

*
* /// Gets the last calculated volume taken from the microphone (ranges roughly between 0 and 1)*
* ///
*
* /// The last volume.*
* public float getLastVolume () {*
* return lastVolume;*
* }*

}