我试图在我的android应用程序中创建一个尖叫和哨声检测器。现在,我可以通过使用musicg库这里来检测用户的口哨。我必须自己实现尖叫探测器,因为没有可用的库。
在musicg中,它读取音频数据并将其存储在字节缓冲区中。它在哨声检测器中使用缓冲器作为输入。我试图通过在LogCat中打印这些字节来查看和理解它们的样子。但是,我不知道它们是什么,也不知道musicg库如何使用这个输入来检测用户何时吹口哨。
音频数据字节如下所示。我用bufferi + "“打印它们
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那么,有人能告诉我如何使用这个输入来检测用户的哨声吗?
请给我一些想法
谢谢
发布于 2013-10-25 18:18:08
字节流是PCM音频。数组中的每个字节都是声音在任何特定时刻的响亮程度。音频处理通常以块的形式进行。例如,在您使用的lirbary中,WaveTypeDetector类循环遍历字节块,并对每个块执行快速傅立叶变换以确定间距。
在音频中,一秒钟的时间并不能告诉你声音的频率(音高)。为了对声音进行有用的分析,需要像这个数组那样的音频块。
FFT输出由字节数组表示的时间块的声级与频率的函数。例如,这可以用来检测声音中哪个音高是最响亮的。
当该方法在一系列的声音块上重复执行时,该库可以比较音高随时间的变化情况,以根据这些类型的声音所产生的已知音高模式来确定正在播放的声音类型(吹口哨或鼓掌)。
这个库正在对一系列的声音块进行分析。对于每个块,它决定声音是否符合某一套标准(例如,它是否在一定的频率范围和一定的强度范围内)。然后,对声音文件的整个长度进行重复,并将WhistleApi类的布尔响应除以,以输出整个声音文件作为一个哨子的概率。
要创建尖叫检测,我认为您需要扩展DetectionApi类来创建一个ScreamApi类,并以WhistleApi类为例。然后,您必须拿出自己的标准值来替换WhistleApi使用的标准值。
为了想出你自己的尖叫标准,你可以对你认为应该被接受的不同类型的尖叫做几十次录音。我会从文件的开头和结尾切入,这样他们就不会沉默了。然后临时修改DetectionApi类以记录它为这些条件中的每个条件读取的最大值和最小值。您将得到每个文件的一系列值,因此您可以将它们放在Excel中以获得平均值和标准差。对于每个准则,我将使用类似于该准则的最小值和最大值的平均+/- 3标准差的值。比较所有声音文件的这些值,以调整它们,可能会抛出异常文件。
https://stackoverflow.com/questions/19595552
复制相似问题