当用户停止使用 Swift 2 说话时如何停止录制语音

问题描述 投票:0回答:2

我将

AVFoundation - AVAudioRecorder - AVAudioPlayer
Swift 2
一起使用并创建了一个简单的录音机。目前,您可以使用“停止”按钮停止录制。当用户停止说话时是否可以停止录音?像 Siri 这样的东西。谢谢!

swift swift2 ios9 avfoundation
2个回答
2
投票

一种可能的解决方案是使用 AVAudioRecorder 的音频电平计量。我从未尝试过,所以我不确定它有多准确,或者对背景噪音有多敏感。

我会看看这个https://developer.apple.com/library/ios/documentation/AVFoundation/Reference/AVAudioRecorder_ClassReference/#//apple_ref/occ/instm/AVAudioRecorder/averagePowerForChannel

根据文档,averagePowerForChannel 返回

正在录制的声音的当前平均功率(以分贝为单位)。返回值 0 dB 表示满量程或最大功率;返回值 -160 dB 表示最小功率(即接近静音)。

当您开始录音时,我会对该值采样一两秒,然后取平均值,从而得出背景噪声水平。

当用户说话时,音量应从此提高。

继续监控该值,然后当它返回到背景水平内的某个范围一秒钟左右时,关闭录音。

它可能不如 Siri 准确(它可能会进行更多处理,并且可能进行语音检测),但它可能足以满足您的目的。

面临的挑战将是找出背景水平和说话音量之间的差异以及灵敏度是多少 - 如果它们很接近,则可能无法正常工作。


0
投票

我能够成功地使用监控的想法,并且效果非常好。我可以提供我是如何做到的代码。

但是,它并不是 100% 万无一失,因为在创建基线时或用户停止说话后,它可能会被环境噪音干扰。您仍然需要有办法手动停止录制,以防“自动停止”不起作用。

我发现更好、更可靠的解决方案是在录音时使用“按住”按钮,按下按钮开始录音,释放按钮终止录音。这是我要执行的代码,以使“按住”功能正常工作(以及在用户点击按钮而不是按住按钮时触发警报消息):

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"))
            )
        }
© www.soinside.com 2019 - 2024. All rights reserved.