从audio文件input中检测人声

我试图实现自动语音录制function,类似于会说话的汤姆应用程序。 我使用以下代码从录音机读取input并分析缓冲区:

float totalAbsValue = 0.0f; short sample = 0; numberOfReadBytes = audioRecorder.read( audioBuffer, 0, bufferSizeInBytes); // Analyze Sound. for( int i=0; i<bufferSizeInBytes; i+=2 ) { sample = (short)( (audioBuffer[i]) | audioBuffer[i + 1] << 8 ); totalAbsValue += Math.abs( sample ) / (numberOfReadBytes/2); } // Analyze temp buffer. tempFloatBuffer[tempIndex%3] = totalAbsValue; float temp = 0.0f; for( int i=0; i<3; ++i ) temp += tempFloatBuffer[i]; 

现在,我可以检测来自录音机的语音input,并可以分析audio缓冲区。

将缓冲区转换为浮点值,如果增加一定量,则假定背景中有一些声音,并开始logging。 但问题是,应用程序开始logging所有的背景噪音,包括风扇/ AC风pipe的声音。

任何人都可以帮助我分析缓冲区来检测人声吗? 或者还有其他的替代方法来检测录音机input的人声吗?

提前致谢,

Solutions Collecting From Web of "从audio文件input中检测人声"

语音检测并不那么简单。 有几种algorithm,其中一些algorithm被发布,例如GSM VAD 。 有几个开源VAD库可用,其中一些在这里讨论

如果你想有一个干净的录音,你可以

  1. 从语音中滤除噪声,您可以使用FFT来应用滤波器,如低通,高通和带通滤波器使用FFT和滤波器进行滤波

2.过滤后,噪音会降低,您可以使用语音识别API

蜜蜂

越多滤波越好,噪声越less越好,但是在滤波时要小心,因为它也可以将噪声与噪声一起去除。

也阅读更多关于FFt

人声的快速傅里叶变换

希望这可以帮助 :)

处理input的方法是使用去除噪声的专用库。

例如, http://audacity.sourceforge.net ,是否会去除噪音。

只要你已经表征了主要types的噪音,你应该只有语音保持。

在从用户捕获之前以及在用户结束捕获之后收集采样数据是值得的,因为这将在同一时间提供环境中的噪声样本。 如果每个用户面临独特的背景噪音挑战,这是有用的。

你到底在找什么 你只是想过滤出audio中的人类语言还是你真的想知道这个人说了些什么?

几乎所有的智能手机都可以通过在设备背面使用第二个麦克风logging背景噪声来过滤人类语音,然后减去这两个信号。 但说实话,我还没有看到任何Android API可以直接访问这两个信号。

如果你想做文字转换的话,那么看看Sphinx4和Praat。 都做这个工作,但又一次,我没有看到Android的实施。 Sphinx4声称完全用Java编写,因此应该可以将它embedded到Android应用程序中。

对于语音检测,请尝试fttalgorithm。

对于噪声,请尝试speex库。

你有没有考虑过使用微软的语音识别API? 在“星际旅行”中询问电脑之前,您可以使用语音密钥发声来开始录音,比如他们如何说“电脑”。 使用ISpRecognizer :: CreateRecoContext加载您的识别语法并开始识别。 然后用ISpPhrase执行检查,看看你是否应该开始录制。

在完全一般的情况下,这是一个未解决的问题。 在实际意义上…

第一步是获得尽可能无噪音的录音。 正如其他人所指出的那样,从一个定向麦克风开始,专注于你想要保持的声音。

第二步是过滤。 如前所述,电话公司做了很多工作,人们在语音理解中实际需要哪些频率范围。 过滤掉这个范围以外的频率将会使得语音听起来像…好,一个电话……但是会摆脱更多的背景噪音。

如果你想超越这个,事情会变得非常复杂。 有一些algorithm,如果你能给他们看一个你认为在特定录音上有什么噪音的样本,就会分析它并试图将其减掉,而不会损坏你想要保留的声音。 这不是简单的编程; 如果我是你,我会认真考虑从已经正确的人那里购买它,而不是试图重新实现它。 我不知道它们中的任何一个是否可用于Android,或者典型的Android盒子是否具有足够的计算能力以实时执行它们。 (我在工作室使用了SoundSoap来消除空调噪音,而且效果很好。)

实际上,我自己的倾向是将问题简单化为一个解决的问题:使用我能得到的最具有定向性和最近的麦克风,让Android进行录音……但之后再进行信号处理以便清理它,现成的工具。 但是我承认我有偏见,因为我已经投资了后者。

我试图解决Windows上的类似问题。 有一件事我学得很快 – 用快速傅立叶变换进行简单的频率分析是不够的。 许多噪音击中了人的频率 – 从麦克风的简单敲击到拍手。 即使是某种程度的复杂过滤也不行。 我发现最简单的方法就是把噪音带到一个云API,并要求它转录这个语音。 如果云API可以转录为合理长度的string,那么我可以继续录制 – 否则,停止录制。 这确实需要您抽取一些噪音并将其发送给云提供商。

他们中的大多数人误解了这个问题,他们的回答解决了与你不同的问题。

您应该parsing缓冲区中的audio,search人声范围内的频率。 只要你发现它们,就意味着有人开始说话,并且你可以开始录音(不要忘了把缓冲区也包含在讲话的第一部分)。

search打印audio原始stream中频率列表的例程