gpt4 book ai didi

ios - 使用 SFSpeechRecognizer 后 AVSpeechSynthesizer 不说话

转载 作者:技术小花猫 更新时间:2023-10-29 10:55:37 29 4
gpt4 key购买 nike

所以我构建了一个简单的应用程序,它使用 SFSpeechRecognizer 进行语音识别,并在屏幕上的 UITextView 中将转换后的语音显示为文本。现在我想让手机说出显示的​​文字。由于某种原因它不起作用。 AVSpeechSynthesizer 说话功能仅在使用 SFSpeechRecognizer 之前有效。例如,当应用程序启动时,它会在 UITextView 中显示一些欢迎文字,如果我点击说话按钮,手机会说出欢迎文字。然后如果我录制(用于语音识别),识别的语音将显示在 UITextView 中。现在我想让手机说出那段文字,但不幸的是它不会。

这是代码

import UIKit
import Speech
import AVFoundation


class ViewController: UIViewController, SFSpeechRecognizerDelegate, AVSpeechSynthesizerDelegate {

@IBOutlet weak var textView: UITextView!
@IBOutlet weak var microphoneButton: UIButton!

private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))!

private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var recognitionTask: SFSpeechRecognitionTask?
private let audioEngine = AVAudioEngine()

override func viewDidLoad() {
super.viewDidLoad()

microphoneButton.isEnabled = false

speechRecognizer.delegate = self

SFSpeechRecognizer.requestAuthorization { (authStatus) in

var isButtonEnabled = false

switch authStatus {
case .authorized:
isButtonEnabled = true

case .denied:
isButtonEnabled = false
print("User denied access to speech recognition")

case .restricted:
isButtonEnabled = false
print("Speech recognition restricted on this device")

case .notDetermined:
isButtonEnabled = false
print("Speech recognition not yet authorized")
}

OperationQueue.main.addOperation() {
self.microphoneButton.isEnabled = isButtonEnabled
}
}
}

@IBAction func speakTapped(_ sender: UIButton) {
let string = self.textView.text
let utterance = AVSpeechUtterance(string: string!)
let synthesizer = AVSpeechSynthesizer()
synthesizer.delegate = self
synthesizer.speak(utterance)
}
@IBAction func microphoneTapped(_ sender: AnyObject) {
if audioEngine.isRunning {
audioEngine.stop()
recognitionRequest?.endAudio()
microphoneButton.isEnabled = false
microphoneButton.setTitle("Start Recording", for: .normal)
} else {
startRecording()
microphoneButton.setTitle("Stop Recording", for: .normal)
}
}

func startRecording() {

if recognitionTask != nil { //1
recognitionTask?.cancel()
recognitionTask = nil
}

let audioSession = AVAudioSession.sharedInstance() //2
do {
try audioSession.setCategory(AVAudioSessionCategoryRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
} catch {
print("audioSession properties weren't set because of an error.")
}

recognitionRequest = SFSpeechAudioBufferRecognitionRequest() //3

guard let inputNode = audioEngine.inputNode else {
fatalError("Audio engine has no input node")
} //4

guard let recognitionRequest = recognitionRequest else {
fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
} //5

recognitionRequest.shouldReportPartialResults = true //6

recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, resultHandler: { (result, error) in //7

var isFinal = false //8

if result != nil {

self.textView.text = result?.bestTranscription.formattedString //9
isFinal = (result?.isFinal)!
}

if error != nil || isFinal { //10
self.audioEngine.stop()
inputNode.removeTap(onBus: 0)

self.recognitionRequest = nil
self.recognitionTask = nil

self.microphoneButton.isEnabled = true
}
})

let recordingFormat = inputNode.outputFormat(forBus: 0) //11
inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer, when) in
self.recognitionRequest?.append(buffer)
}

audioEngine.prepare() //12

do {
try audioEngine.start()
} catch {
print("audioEngine couldn't start because of an error.")
}

textView.text = "Say something, I'm listening!"

}

func speechRecognizer(_ speechRecognizer: SFSpeechRecognizer, availabilityDidChange available: Bool) {
if available {
microphoneButton.isEnabled = true
} else {
microphoneButton.isEnabled = false
}
}
}

最佳答案

您应该将 startRecording 方法的这一行从:

try audioSession.setCategory(AVAudioSessionCategoryRecord)            

到:

try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)

关于ios - 使用 SFSpeechRecognizer 后 AVSpeechSynthesizer 不说话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40270738/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com