簡體   English   中英

麥克風輸入的最大浮點數為1。如何將其變大並從1更改? 統一 C#

[英]Microphone input's maximum float number is 1. How to make it bigger and change it from 1? Unity C#

我有一個代碼,它接受麥克風輸入(按“T”時)並將其作為浮點數(一個最終浮點數)返回。 但是,當我對着麥克風大喊或吹氣時,它打印的最大浮點數是 1,無論我在打印 1 后如何大喊或小聲說,它都只會打印 1。 如何將其更改為更大的數字。 假設我大喊大叫它會返回一個比我只是安靜地說更大的數字。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Linq;
public class MicInputs : MonoBehaviour
{
public enum micActivation
{
    HoldToSpeak,

}
public micActivation micControl;
private float sample_max = 0.0f;

public static float MicLoudFloat;
public List<float> recorded_values = new List<float>();
private string theMicroDevice;
AudioClip recordOfClips;
//microphone initialization
void MicroInitialization()
{
    if (theMicroDevice == null) theMicroDevice = Microphone.devices[0];
    recordOfClips = Microphone.Start(theMicroDevice, true, 999, 44100);
}

void StopMicrophone()
{
    Microphone.End(theMicroDevice);
    Maximum_Level(); // Collect the final sample
    MicLoudFloat = sample_max;
    print(MicLoudFloat);

}

void Awake()
{
    recordOfClips = AudioClip.Create("nameOfClip", 128, 2, 1000, true);
}
//AudioClip clip = myRecordedOrOwnClip;
//reate(string name, int lengthSamples, int channels, int frequency, 
bool stream,
//_sampleWindow = clip.samples;
//AudioClip _clipRecord = new AudioClip();
//AudioClip _clipRecord = AudioClip.Create("nameOfClip", 128, 2, 1, 
true);
int samplesWindows = 128;



//=========THIS IS THE START OF THE METHOD========


// get data from microphone into audioclip
float Maximum_Level()
{

    float[] waveData = new float[samplesWindows];
    int micPosition = Microphone.GetPosition(null) - (samplesWindows 
+1); // null means the first microphone
    if (micPosition < 0) return 0;
    recordOfClips.GetData(waveData, micPosition);
    // Getting a peak on the last 128 samples
    for (int i = 0; i < samplesWindows; i++)
    {
        float wavePeak = waveData[i] * waveData[i];
        if (wavePeak > sample_max)
        {
            sample_max = wavePeak;
        }
    }
    return sample_max;
    //float maximum_level = 0;
    //float[] waveData = new float[samplesWindows];
    //int micPosition = Microphone.GetPosition(null) - (samplesWindows 
+ 1); // null means the first microphone
    //if (micPosition < 0) return 0;
    //recordOfClips.GetData(waveData, micPosition);
    //// Getting a peak on the last 128 samples
    //for (int i = 0; i < samplesWindows; i++)
    //{
    //    float wavePeak = waveData[i] * waveData[i];
    //    if (maximum_level < wavePeak)
    //    {
    //        maximum_level = wavePeak;
    //        recorded_values.Add(maximum_level);
    //    }
    //}

    //float max = recorded_values.Max();
    ////print(max);
    //return max;


    //print(maximum_level);
    //return maximum_level;
}

//=========THIS IS THE END OF THE METHOD========



void Update()
{
    if (micControl == micActivation.HoldToSpeak)
    {
        //if (Microphone.IsRecording(theMicroDevice) && 
Input.GetKey(KeyCode.T) == false)
            //StopMicrophone();
        //
        if (Input.GetKeyDown(KeyCode.T)){ //Push to talk
            MicroInitialization();

        }
        //
        if (Input.GetKeyUp(KeyCode.T)){
            StopMicrophone();


        }

    }

    Maximum_Level();
    // levelMax equals to the highest normalized value power 2, a small 
number because < 1
    // pass the value to a static var so we can access it from anywhere


    //print(MicLoudFloat);
}

//bool isItInitialized;

//// start mic when scene starts
//void OnEnable()
//{
//    MicroInitialization();
//    isItInitialized = true;
//}

////stop mic when loading a new level or quit application
//void OnDisable()
//{
//    StopMicrophone();
//}

//void OnDestroy()
//{
//    StopMicrophone();
//}


// detects if the mic gets started & stopped when application gets 
focused
//void OnApplicationFocus(bool focus)
//{
//    if (focus)
//    {
//        //Debug.Log("Focus");

//        if (!isItInitialized)
//        {
//            //Debug.Log("Init Mic");
//            MicroInitialization();
//            isItInitialized = true;
//        }
//    }
//    if (!focus)
//    {
//        //Debug.Log("Pause");
//        StopMicrophone();
//        //Debug.Log("Stop Mic");
//        isItInitialized = false;

//    }
//}
}

傳感器只返回 0 或 1,它不是 0->inf,如果你想要別的東西,比如檢查聲音從 0 到 100 的負載如何,你可以記錄它並檢查音頻文件的最高點並返回.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM