简介:本文详细介绍在iOS 10系统中如何搭建一个完整的语音转文字框架,涵盖权限申请、音频采集、语音识别引擎集成及错误处理等关键环节。
在iOS 10系统中,语音转文字(Speech-to-Text, STT)功能已成为智能交互的核心组件,广泛应用于语音助手、无障碍访问、实时字幕等场景。相较于早期系统,iOS 10通过Speech框架提供了更高效的离线语音识别能力,同时支持多语言识别和实时反馈。开发者需明确以下需求:
在Info.plist中添加以下键值对,以获取用户授权:
<key>NSSpeechRecognitionUsageDescription</key><string>本应用需要访问麦克风以实现语音转文字功能</string><key>NSMicrophoneUsageDescription</key><string>本应用需要麦克风权限以录制语音</string>
关键点:用户首次使用时需弹出权限请求,若拒绝则无法继续。
在Swift项目中,通过import Speech引入框架。该框架提供两类核心API:
使用AVAudioSession管理音频输入,确保麦克风独占访问:
let audioSession = AVAudioSession.sharedInstance()try audioSession.setCategory(.record, mode: .measurement, options: [])try audioSession.setActive(true, options: [])
参数说明:
mode: .measurement:优化低延迟录音。try可能抛出的异常(如权限不足)。通过AVAudioEngine采集音频数据:
let audioEngine = AVAudioEngine()let inputNode = audioEngine.inputNodelet recognitionRequest = SFSpeechAudioBufferRecognitionRequest()let recognitionTask: SFSpeechRecognitionTask?// 配置音频格式(16kHz单声道,16位深度)let recordingFormat = inputNode.outputFormat(forBus: 0)
注意事项:
创建SFSpeechRecognizer实例,并指定语言:
let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))!guard speechRecognizer.isAvailable else {print("语音识别服务不可用")return}
状态检查:
isAvailable:设备是否支持当前语言。将音频数据流式传输至识别请求:
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error inif let result = result {let transcribedText = result.bestTranscription.formattedStringprint("实时转写结果: \(transcribedText)")} else if let error = error {print("识别错误: \(error.localizedDescription)")}}// 连接音频节点与识别请求let recognitionHandler: (AVAudioPCMBuffer, AVAudioTime?) -> Void = { buffer, _ inrecognitionRequest.append(buffer)}audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat, block: recognitionHandler)
关键逻辑:
installTap:实时捕获音频缓冲区。append:将数据推入识别请求队列。
// 启动录音audioEngine.prepare()try audioEngine.start()// 停止录音与任务audioEngine.stop()recognitionRequest.endAudio()recognitionTask?.finish()
资源释放:务必在视图消失时调用stop(),避免内存泄漏。
iOS 10支持通过SFSpeechRecognitionTask的shouldReportPartialResults属性实现增量识别:
recognitionRequest.shouldReportPartialResults = true
适用场景:需要实时显示中间结果的场景(如语音输入框)。
捕获并分类错误类型:
switch error {case SFSpeechErrorCode.audioError:print("音频采集失败")case SFSpeechErrorCode.recognitionError:print("识别引擎错误")default:print("未知错误")}
重试策略:
weak引用避免循环保留(如recognitionTask)。
import Speechimport AVFoundationclass SpeechToTextManager {private let audioEngine = AVAudioEngine()private var recognitionTask: SFSpeechRecognitionTask?private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))!func startRecording() throws {// 检查权限SFSpeechRecognizer.requestAuthorization { authStatus inguard authStatus == .authorized else {print("未授权语音识别权限")return}// 配置音频会话let audioSession = AVAudioSession.sharedInstance()try audioSession.setCategory(.record, mode: .measurement)try audioSession.setActive(true)// 创建识别请求let recognitionRequest = SFSpeechAudioBufferRecognitionRequest()guard let inputNode = self.audioEngine.inputNode else { return }// 启动识别任务self.recognitionTask = self.speechRecognizer.recognitionTask(with: recognitionRequest) { result, error inif let text = result?.bestTranscription.formattedString {print("转写结果: \(text)")}}// 安装音频捕获let recordingFormat = inputNode.outputFormat(forBus: 0)inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ inrecognitionRequest.append(buffer)}// 启动引擎self.audioEngine.prepare()try self.audioEngine.start()}}func stopRecording() {audioEngine.stop()audioEngine.inputNode?.removeTap(onBus: 0)recognitionTask?.finish()recognitionTask = nil}}
通过以上步骤,开发者可在iOS 10中快速构建一个稳定、高效的语音转文字框架,为应用增添智能交互能力。