30

我正在尝试实现自动录音功能,类似于会说话的汤姆应用程序。我使用以下代码从录音机读取输入并分析缓冲区:

 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];

现在我能够检测到来自录音机的语音输入,并且可以分析音频缓冲区。

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

谁能帮我分析缓冲区以仅检测人声?还是有其他替代方法可以从录音机输入中检测人声?

提前致谢,

4

9 回答 9

11

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

于 2013-08-30T03:08:19.183 回答
4

对于语音检测,请尝试 ftt 算法。

对于噪音,请尝试 speex 库。

于 2013-09-02T02:09:13.957 回答
4

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

  1. 过滤语音中的噪音,您可以使用FFT并应用过滤器,例如低通、高通和带通过滤器 使用 FFT和 过滤器进行过滤

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

蜜蜂

过滤越多,噪音越少 识别越多,但过滤时要小心,因为它也可以将声音与噪音一起去除。

另请阅读有关 FFt 的更多信息

人声的快速傅里叶变换

希望这可以帮助 :)

于 2013-09-02T02:25:18.923 回答
3

你到底在找什么?您只是想过滤掉音频中的人声,还是真的想知道这个人说了什么?

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

如果你想做语音到文本的转换,那么看看 Sphinx4 和 Praat。两者都做这项工作,但同样,我还没有看到 Android 的实现。Sphinx4 声称完全用 Java 编写,因此应该可以将其嵌入到 Android 应用程序中。

于 2013-08-30T17:49:49.587 回答
1

处理输入的方法是使用专门的去噪库。

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

只要你已经描述了主要的噪音类型,你就应该只剩下语音了。

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

于 2013-08-26T21:43:45.993 回答
1

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

第一步是获得尽可能无噪音的录音。正如其他人所指出的那样,首先要使用定向麦克风,尽可能专注于您想要保留的声音。

第二步是过滤。如前所述,电话公司在人类语音理解实际需要哪些频率范围方面做了大量工作。过滤掉该范围之外的频率将使声音听起来像……嗯,电话……但会消除更多的背景噪音。

如果你想超越这一点,事情会变得非常复杂。有一些算法,如果您可以向他们展示您认为该特定录音中的噪音样本,将对其进行分析并尝试将其减去而不会过多地损坏您想要保留的声音。这不是简单的编程;如果我是你,我会认真考虑从已经做对的人那里购买它,而不是试图重新发明/重新实现它。我不知道它们中的任何一个是否可用于 Android,或者典型的 Android 机器是否有足够的计算能力来实时执行它们。(我在工作室使用 SoundSoap 去除空调噪音,效果很好。)

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

于 2013-09-01T16:56:04.980 回答
1

您是否考虑过使用 Microsoft 的语音识别 API?您可以使用语音键发音开始录制,例如在星际迷航中询问计算机之前他们如何说“计算机”。使用 ISpRecognizer::CreateRecoContext 加载您的识别语法并开始识别。然后使用 ISpPhrase 进行检查,看看您是否应该开始录制。

于 2013-08-30T16:56:25.080 回答
1

我试图在 Windows 上解决类似的问题。我学得很快的一件事——使用快速傅里叶变换的简单频率分析是不够的。很多噪音都触及人类的频率——从简单的麦克风轻敲到拍手。即使是某种程度的复杂过滤也无法做到这一点。我发现最简单的方法是将噪音带到云 API 并要求它转录语音。如果云 API 可以转录成合理长度的字符串,那么我可以继续录制——否则,停止录制。这确实需要您对一些噪声进行采样并将其发送给云提供商。

于 2015-09-17T23:02:06.687 回答
0

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

您应该解析缓冲区中的音频,以搜索人类语音范围内的频率。一旦你检测到它们,就意味着有人已经开始说话了,你可以开始录制(不要忘记也包括缓冲区,因为它包含语音的第一部分)。

搜索在音频原始流中打印频率列表的例程

于 2013-09-01T20:46:10.553 回答