// The "press and hold" functionality ends when the user releases the AskAimee button, triggering the following actions.
// CODE TO START RECORDING GOES HERE
} label:{
// LABEL FOR THE PRESS-AND-HOLD BUTTON GOES HERE
ButtonLabelView()
// A single-tap can be used to trigger an alert to give the user instruction that a press-and-hold gesture must be used instead of a tap gesture
.onTapGesture {
setupHelpTitle ="Press and Hold"
setupHelpContent ="You need to press the button and hold it to record. Recording will stop when you release the button."
showSetupHelp =true
}
}// Tap gesture closure
}
// The "press and hold" functionality begins with a simultaneous LongPressGesture, triggering the actions in the .onEnded modifier of the gesture.
.simultaneousGesture(
LongPressGesture(minimumDuration:0.25)
.onEnded({ _ in
// CODE TO BEGIN RECORDING AFTER THE MINIMUM HOLD TIME HERE
})
)// simultaneousGesture closure
// This alert is used to provide a notification to the user about the recording function (e.g., if user tapped the button, the alert would indicate that the button needs to be pressed and held to work).
2条答案
按热度按时间juzqafwq1#
一种可能的解决方案是使用AVAudioRecorder的音频电平测量。我从来没有试过,所以我不确定它有多准确,或者对背景噪音有多敏感。
我会看看这个https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/#//apple_ref/occ/instm/AVAudioRecorder/averagePowerForChannel:
根据文档,averagePowerForChannel返回
正在录制的声音的当前平均功率(以分贝为单位)。返回值0 dB表示满量程或最大功率;返回值-160 dB表示最小功率(即,接近静音)。
当你开始录音时,我会对这个值进行一两秒的采样,然后求出平均值,这就给了你一个背景噪音水平。
当用户说话时,音量应该从这里上升。
继续监视此值,然后当它返回到背景水平内的某个范围约一秒时,关闭录制。
它可能不如Siri准确(Siri可能会进行更多的处理,并可能进行语音检测),但它可能足以满足您的目的。
挑战将是工作之间的差异,背景水平和谈话音量和灵敏度是什么-如果他们是接近,它可能不会工作得很好。
r6l8ljro2#
我能够成功地使用监控的想法,它工作得很好。我可以提供代码说明我是如何做到的。
然而,它并不是100%安全的,因为在创建基线时或用户退出发言后,它可能会被环境噪音所干扰。你仍然需要有一种方法来手动停止录制的情况下,“自动停止”不工作。
我发现一个更好更可靠的解决方案是在录制时使用“按住”按钮,按下按钮开始录制,释放按钮终止录制。下面是我的代码,以使“按住”功能工作(沿着触发警报消息,以防用户点击按钮而不是按住它):