gpt4 book ai didi

android - Android实时静音检测

转载 作者:行者123 更新时间:2023-12-03 00:14:01 25 4
gpt4 key购买 nike

我试图从用户那里获取实时音频输入,并且每300毫秒我就采样一次。我正在使用PCM 16位采样和44100采样率。
我正在将音频记录器中的数据读取到一个短数组中,并且每300毫秒打印一次所有样本的平均值。
但是,问题在于平均值似乎是随机的,即使出现沉默(也不应该如此),它也显示出较大的值。
我想知道我是否以正确的方式使用了短数组。

public void startRecording() {
recorder = new AudioRecord(MediaRecorder.AudioSource.VOICE_RECOGNITION, SAMPLE_RATE,
channels, AUDIO_FORMAT, Buffersize);

recorder.startRecording();

isRecording = true;
NoiseSuppressor.create(recorder.getAudioSessionId());
AcousticEchoCanceler.create(recorder.getAudioSessionId());
AutomaticGainControl.create(recorder.getAudioSessionId());

recordingThread = new Thread(new Runnable()

{
public void run() {
writeAudioData();
}

});
recordingThread.start();

}
private void writeAudioData() {

short data[] = new short[Buffersize/2];

while(isRecording) {

samplesread =0;
value = 0;
long ftime = System.currentTimeMillis()+300;
while (ftime > System.currentTimeMillis()) { // loop for taking average of 300 ms

if(isRecording){
samplesread += recorder.read(data, 0, Buffersize/2); // reads the data from the recorder and srores in the short array
int i=0;
while(i<Buffersize/2) {

//value += (long)(data[i]);
value += (long)(data[i] & 0xFFFF); // considering the PCM samples are signed I tried this


i++;

}

}
}
show = value;
div = samplesread;

handler.postDelayed(new Runnable() {
@Override
public void run() {
TextView tv = (TextView) findViewById(R.id.textView);
tv.setText(""+(show/(div))+" "+div);
TextView tv2 = (TextView) findViewById(R.id.textView2);
tv2.setText(show+" "+ System.currentTimeMillis());

}
},0);

}

}

最佳答案

数组值由带符号的数字组成,因此,取平均值时未显示期望的结果。当我取RMS值而不是取平均值时,它可以工作。

关于android - Android实时静音检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43338528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com