苹果自带语音识别与翻译及代码实现

2,010 阅读2分钟
导入语音识别和翻译机器框架,可以按照以下步骤操作:

步骤 1: 导入 Speech.framework

  1. 打开 Xcode,选择你的项目。
  2. 在项目导航栏中,点击项目名称(非 Targets)。
  3. 在 “General” 选项卡下,找到 “Frameworks, Libraries, and Embedded Content”。
  4. 点击 “+” 按钮,在弹出的框架列表中选择 Speech.framework,点击 “Add” 添加。

步骤 2: 配置 Info.plist

请注意,在使用语音识别和翻译机器框架之前,您需要在Info.plist文件中请求用户授权以访问语音识别和麦克风。可以通过添加以下键和值来完成此操作:


<key>NSSpeechRecognitionUsageDescription</key>
<string>此应用需要语音识别功能以将语音转换为文字。</string>
<key>NSMicrophoneUsageDescription</key>
<string>此应用需要访问麦克风以录制语音。</string>

步骤 3: 实现语音识别与翻译

######在需要翻译的代码中,使用以下代码示例进行调用:

import Foundation
import Speech
import AVFoundation

class SpeechTranslationService {
    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh-CN"))
    private let audioEngine = AVAudioEngine()
    private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
    private var recognitionTask: SFSpeechRecognitionTask?

    // 请求语音识别授权
    func requestAuthorization(completion: @escaping (Bool) -> Void) {
        SFSpeechRecognizer.requestAuthorization { status in
            DispatchQueue.main.async {
                completion(status == .authorized)
            }
        }
    }

    // 从音频文件识别语音
    func recognizeSpeech(from url: URL, completion: @escaping (Result<String, Error>) -> Void) {
        guard let recognizer = speechRecognizer, recognizer.isAvailable else {
            completion(.failure(NSError(domain: "", code: -1, userInfo: [NSLocalizedDescriptionKey: "语音识别不可用"])))
            return
        }

        let request = SFSpeechURLRecognitionRequest(url: url)
        recognitionTask = recognizer.recognitionTask(with: request) { result, error in
            if let error = error {
                completion(.failure(error))
                return
            }
            guard let result = result else { return }
            let transcript = result.bestTranscription.formattedString
            completion(.success(transcript))
        }
    }

    // 实时麦克风输入识别(示例)
    func startLiveRecognition(completion: @escaping (Result<String, Error>) -> Void) {
        recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        guard let request = recognitionRequest else { return }

        recognitionTask = speechRecognizer?.recognitionTask(with: request) { result, error in
            if let error = error {
                completion(.failure(error))
                return
            }
            guard let result = result else { return }
            let transcript = result.bestTranscription.formattedString
            completion(.success(transcript))
        }

        let recordingFormat = audioEngine.inputNode.outputFormat(forBus: 0)
        audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
            request.append(buffer)
        }

        audioEngine.prepare()
        try? audioEngine.start()
    }

    func stopLiveRecognition() {
        audioEngine.stop()
        recognitionRequest?.endAudio()
        recognitionTask?.cancel()
        audioEngine.inputNode.removeTap(onBus: 0)
    }

    // 假设的翻译方法(需集成第三方 API)
    func translate(text: String, from sourceLang: String = "zh-CN", to targetLang: String = "en", completion: @escaping (Result<String, Error>) -> Void) {
        // 示例:调用第三方翻译 API(需自行实现)
        // 这里仅为占位符,实际需使用 HTTP 请求
        let mockTranslation = "Translated: \(text)" // 替换为真实翻译逻辑
        completion(.success(mockTranslation))
    }
}

// 使用示例
let service = SpeechTranslationService()

// 请求授权
service.requestAuthorization { authorized in
    if authorized {
        print("授权成功")

        // 从文件识别语音
        let audioURL = Bundle.main.url(forResource: "sample", withExtension: "m4a")!
        service.recognizeSpeech(from: audioURL) { result in
            switch result {
            case .success(let text):
                print("识别结果: \(text)")
                // 翻译
                service.translate(text: text) { translationResult in
                    switch translationResult {
                    case .success(let translatedText):
                        print("翻译结果: \(translatedText)")
                    case .failure(let error):
                        print("翻译失败: \(error.localizedDescription)")
                    }
                }
            case .failure(let error):
                print("识别失败: \(error.localizedDescription)")
            }
        }

        // 或者启动实时识别
        // service.startLiveRecognition { result in ... }
    } else {
        print("授权失败")
    }
}

注意事项

  1. 音频文件:确保 audioURL 指向有效的音频文件(如 .m4a 或 .wav)。
  2. 翻译实现:由于 iOS 无内置翻译框架,需集成第三方服务(如 Google Cloud Translation API)。上述代码中的 translate 方法仅为占位符,实际开发中需替换为真实 API 调用。
  3. 权限检查:实时识别需确保麦克风权限已授权。
  4. 错误处理:代码中增加了基本的错误处理逻辑,提升健壮性。