麦克风输入';s的最大浮点数为1。如何使其变大并将其从1更改为1?统一C#
我有一个接收麦克风输入(按“T”键时)的代码,并将其作为浮点数(最后一个浮点数)返回。然而,当我对着麦克风大喊大叫或吹气时,它打印的最大浮动是1,无论我在打印1后如何大喊大叫或安静地说,它都只会继续打印1。如何将其更改为更大的数字。比方说,如果我大声喊叫,它返回的数字会比我安静地说的数字要大麦克风输入';s的最大浮点数为1。如何使其变大并将其从1更改为1?统一C#,c#,unity3d,C#,Unity3d,我有一个接收麦克风输入(按“T”键时)的代码,并将其作为浮点数(最后一个浮点数)返回。然而,当我对着麦克风大喊大叫或吹气时,它打印的最大浮动是1,无论我在打印1后如何大喊大叫或安静地说,它都只会继续打印1。如何将其更改为更大的数字。比方说,如果我大声喊叫,它返回的数字会比我安静地说的数字要大 using System.Collections; using System.Collections.Generic; using UnityEngine; using System.Linq; publi
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;
// }
//}
}
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine;
使用System.Linq;
公共类输入:单一行为
{
公共枚举激活
{
等等,
}
公共卫生控制;
专用浮子样本_max=0.0f;
公共静态浮点数;
公共列表记录的_值=新列表();
私有字符串微型设备;
音频剪辑录音机;
//麦克风初始化
void微初始化()
{
如果(theMicroDevice==null)theMicroDevice=micro.devices[0];
recordOfClips=麦克风启动(MicroDevice,true,999,44100);
}
无效停止麦克风()
{
麦克风。结束(微型设备);
最大水平();//采集最终样本
MicLoudFloat=样本最大值;
打印(MicLoudFloat);
}
无效唤醒()
{
recordOfClips=AudioClip.Create(“nameOfClip”,128,21000,true);
}
//音频剪辑剪辑=MyRecordedRownClip;
//创建(字符串名称、整数长度样本、整数通道、整数频率、,
布尔溪,
//_sampleWindow=clip.samples;
//AudioClip_clipRecord=新的AudioClip();
//AudioClip\u clipRecord=AudioClip.Create(“nameOfClip”,128,2,1,
正确的);
int samplesWindows=128;
//==========这是该方法的开始========
//将麦克风中的数据输入音频剪辑
浮动最大_级()
{
float[]waveData=新的float[samplesWindows];
int micPosition=麦克风.GetPosition(null)-(示例窗口
+1) ;//null表示第一个麦克风
如果(micPosition<0)返回0;
recordOfClips.GetData(waveData,micPosition);
//在最后128个样本中获得峰值
对于(int i=0;i采样最大值)
{
样本_max=波峰;
}
}
返回样本_max;
//浮动最大水平=0;
//float[]waveData=新的float[samplesWindows];
//int micPosition=麦克风.GetPosition(null)-(示例窗口
+1);//null表示第一个麦克风
//如果(micPosition<0)返回0;
//recordOfClips.GetData(waveData,micPosition);
////在最后128个样本中获得峰值
//对于(int i=0;i
传感器只返回0或1,而不是0->inf,如果你想做其他事情,比如检查声音从0到100的负载,你可以录制它并检查音频文件,然后返回该值。实际传感器只返回0到1的值。可以在部分数字处进行检查。或者只需将输入乘以数字。类似于100。在StopMirror()中,我将sample_max乘以100。它只是将数字乘以100。这意味着它将给出100,而不是1。如果传感器返回0到1作为浮点值,而您想要“满音量的一半”,jsut将其与>=0.5进行比较您得到了浮点值。使用它们。因为您说,当您大声喊叫时,它返回的数字确实大于您安静说话时返回的数字,所以不清楚您在问什么。如果问题是您的麦克风的动态范围小,那么这不是您可以在软件中解决的问题。请购买更好的麦克风。