【发布时间】:2011-03-25 18:26:24
【问题描述】:
我正在尝试根据用户是否发出响亮的声音来执行特定操作。我不想做任何语音识别或任何事情。只需根据 iPhone 是否听到响亮的声音进行操作即可。
任何建议、教程,我在苹果开发者网站上都找不到任何东西。我假设我没有寻找或搜索正确。
【问题讨论】:
标签: iphone objective-c ios4 iphone-sdk-3.0
我正在尝试根据用户是否发出响亮的声音来执行特定操作。我不想做任何语音识别或任何事情。只需根据 iPhone 是否听到响亮的声音进行操作即可。
任何建议、教程,我在苹果开发者网站上都找不到任何东西。我假设我没有寻找或搜索正确。
【问题讨论】:
标签: iphone objective-c ios4 iphone-sdk-3.0
对您来说最简单的事情是使用 AudioQueue 服务。这是手册: Apple AQ manual
基本上,查找任何使用 AudioQueueNewInput() 初始化事物的示例代码。像这样的:
Status = AudioQueueNewInput(&_Description,
Audio_Input_Buffer_Ready,
self,
NULL,
NULL,
0,
&self->Queue);
完成后,您可以通过以下方式启用声级测量:
// Turn on level metering (iOS 2.0 and later)
UInt32 on = 1;
AudioQueueSetProperty(self->Queue,kAudioQueueProperty_EnableLevelMetering,&on,sizeof(on));
您将拥有一个为每个音频数据块调用的回调例程。在其中,您可以通过以下方式检查当前仪表级别:
//
// Check metering levels and detect silence
//
AudioQueueLevelMeterState meters[1];
UInt32 dlen = sizeof(meters);
Status = AudioQueueGetProperty(_Queue,kAudioQueueProperty_CurrentLevelMeterDB,meters,&dlen);
if (Status == 0) {
if (meters[0].mPeakPower > _threshold) {
silence = 0.0; // reset silence timer
} else {
silence += time;
}
}
//
// Notify observers of incoming data.
//
if (delegate) {
[delegate audioMeter:meters[0].mPeakPower duration:time];
[delegate audioData:Buffer->mAudioData size:Buffer->mAudioDataByteSize];
}
或者,在您的情况下,您可以检测分贝水平是否超过某个值足够长的时间,而不是静音。请注意,您将看到的分贝值范围从大约 -70.0 表示完全无声,最高为 0.0db 表示非常响亮的声音。在指数范围内。您必须使用它来查看哪些值适用于您的特定应用程序。
【讨论】:
Apple 有诸如Speak Here 之类的示例,它看起来有与分贝相关的代码。我会检查一些仪表类的例子。我没有音频编程经验,但希望能在有人为您提供更好的答案时帮助您入门。
【讨论】: