swift2 如何在用户停止使用Swift 2时停止录制语音

bxjv4tth  于 2023-10-18  发布在  Swift
关注(0)|答案(2)|浏览(303)

我使用AVFoundation - AVAudioRecorder - AVAudioPlayerSwift 2创建了一个简单的录音机。目前,您可以使用“停止”按钮停止录制。当用户停止说话时,是否可以停止录制?类似Siri的东西。谢谢你,谢谢

juzqafwq

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可能会进行更多的处理,并可能进行语音检测),但它可能足以满足您的目的。
挑战将是工作之间的差异,背景水平和谈话音量和灵敏度是什么-如果他们是接近,它可能不会工作得很好。

r6l8ljro

r6l8ljro2#

我能够成功地使用监控的想法,它工作得很好。我可以提供代码说明我是如何做到的。
然而,它并不是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"))
            )
        }

相关问题