1

我尝试在我的 android 应用程序中创建一个尖叫和口哨检测器。现在我可以在这里使用 musicg android 库来检测用户的口哨声。我必须自己实现尖叫检测器,因为没有可用的库。

在 musicg 中,它读取音频数据并将其存储在字节缓冲区中。它使用缓冲区作为其哨声检测器的输入。我试图通过在 LogCat 中打印这些字节来查看和理解它们的外观。但是,我不知道它们是什么以及 musicg 库如何使用此输入来检测用户何时吹口哨。

音频数据字节如下所示。我使用 buffer[i] + "" 来打印它们

10-25 23:43:54.412: E/1115(7542): 71 
10-25 23:43:54.412: E/1116(7542): 22
10-25 23:43:54.412: E/1117(7542): 58
10-25 23:43:54.412: E/1118(7542): -14
10-25 23:43:54.412: E/1119(7542): 36
10-25 23:43:54.412: E/1120(7542): 88
10-25 23:43:54.412: E/1121(7542): 8
10-25 23:43:54.413: E/1122(7542): -98
10-25 23:43:54.413: E/1123(7542): -24
10-25 23:43:54.413: E/1124(7542): 66
10-25 23:43:54.413: E/1125(7542): -51
10-25 23:43:54.413: E/1126(7542): 111
10-25 23:43:54.413: E/1127(7542): -67
10-25 23:43:54.413: E/1128(7542): 43
10-25 23:43:54.413: E/1129(7542): -68
10-25 23:43:54.413: E/1130(7542): 36
10-25 23:43:54.415: E/1131(7542): -58
10-25 23:43:54.415: E/1132(7542): -85
10-25 23:43:54.415: E/1133(7542): -46
10-25 23:43:54.415: E/1134(7542): 78
10-25 23:43:54.415: E/1135(7542): -40

那么,谁能告诉我如何使用这个输入来检测用户的口哨。

请给我一些想法

谢谢

4

1 回答 1

3

字节流是 PCM 音频。数组中的每个字节都是声音在任何特定时刻的响度。音频处理通常分块完成。例如,在您使用的库中,WaveTypeDetector 类循环遍历字节块并对每个块执行 FFT 以确定音高。

音频中的一瞬间并不能告诉您有关声音频率(音高)的任何信息。要对声音进行有用的分析,需要像这样的数组这样的音频块。

FFT 输出由字节数组表示的时间块的声级与频率的函数。例如,这可用于检测声音中的哪些音高最大。

并且当对一系列声音块重复执行该方法时,库可以比较音高如何随时间变化,以确定正在播放哪种声音(吹口哨或拍手),基于这些类型声音的已知音高模式制作。

该库正在对一系列声音块进行分析。对于每个块,它确定声音是否符合特定的一组标准(例如,它是否在特定的频率范围和特定的强度范围内)。然后它对声音文件的整个长度重复此操作,并将 WhistleApi 类的布尔响应除以输出整个声音文件作为一个整体是口哨的概率。

要创建尖叫检测,我认为您需要扩展 DetectionApi 类以创建 ScreamApi 类,以 WhistleApi 类为例。然后,您必须提出自己的标准值来替换 WhistleApi 使用的标准值。

要提出自己的尖叫标准,您可以录制几十个您认为应该可以接受的不同类型的尖叫声。我会剪掉文件的开头和结尾,这样它们就不会沉默了。然后临时修改 DetectionApi 类以记录它为每个标准读取的最大值和最小值。您将获得每个文件的一长串值,因此您可以将它们放在 Excel 中以获得平均值和标准差。对于每个标准,我会为该标准的最小值和最大值使用平均值 +/- 3 标准差。比较所有声音文件中的这些值以调整它们,可能会丢弃异常文件。

于 2013-10-25T18:18:08.160 回答