Button {
// 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).
.alert(isPresented: $showSetupHelp) {
Alert(
title: Text(setupHelpTitle),
message: Text("\(setupHelpContent)"),
dismissButton: .default(Text("OK"))
)
}
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%安全的,因为在创建基线时或用户退出发言后,它可能会被环境噪音所干扰。你仍然需要有一种方法来手动停止录制的情况下,“自动停止”不工作。
我发现一个更好更可靠的解决方案是在录制时使用“按住”按钮,按下按钮开始录制,释放按钮终止录制。下面是我的代码,以使“按住”功能工作(沿着触发警报消息,以防用户点击按钮而不是按住它):