我正在尝试使用Swift创建一个应用。
我正确集成了语音到文本和文本到语音:我的应用程序运行完美。您可以找到我的项目here。
语音转文本后,该应用向服务器发出一个http请求(发送已识别的文本),然后以语音方式复制响应(它是一个字符串,即:“好,我会告诉你一些东西”)从文字到语音。但是,有一个大问题,我无法解决。
当应用程序以语音方式复制文本时,声音太慢了,好像它在背景中一样,好像有什么东西要比声音更重要(实际上什么都没有)。
调试时,我发现问题开始使用函数recordAndRecognizeSpeech()
中的audioEngine(AVAudioEngine)。在不使用此功能的情况下运行该应用程序并播放随机文本,它的工作原理就像一个超级按钮。
所以,我认为当应用程序以语音方式复制文本时,它认为仍然有活动的音频引擎,因此音量非常慢。
但是,在复制文本之前,我调用了这些函数(在ac函数的内部,第96行):
audioEngine.stop()
audioEngine.reset()
我该如何解决这个问题?
编辑:
我找到了部分解决方案。现在,在应用程序大声播放文本之前,我的代码是:
audioEngine.inputNode.removeTap(onBus: 0)
audioEngine.stop()
audioEngine.reset()
recognitionTask?.cancel()
isRecording = false
microphoneButton.setTitle("Avvia..", for: UIControl.State.normal);
do {
let audioSession = AVAudioSession.sharedInstance()
try audioSession.setCategory(AVAudioSession.Category.ambient)
try audioSession.setActive(false, options: .notifyOthersOnDeactivation)
} catch {
print(error)
}
make_request(msg: self.speech_result.text!)
.setCategory函数可以正常工作,其音量类似于默认音量。当我尝试调用recordAndRecognizeSpeech()
函数时,该应用程序给了我以下异常:
VAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioIONodeImpl.mm:910:SetOutputFormat: (IsFormatSampleRateAndChannelCountValid(hwFormat))]
此异常是由.setCategory(AVAudioSession.Category.ambient)
引起的,应为.playAndRecord,但使用此值,音量将恢复为较低。
答案 0 :(得分:0)
尝试一下。 设置播放速度
var speedd = AVSpeechSynthesizer()
var voicert = AVSpeechUtterance()
voicert = AVSpeechUtterance(string: "Your post appears to contain code that is not properly formatted as code. Please indent all code by 4 spaces using the code toolbar button or the CTRL+K keyboard shortcut. For more editing help, click the [?] toolbar icon")
voicert.voice = AVSpeechSynthesisVoice(language: "en-US")
voicert.rate = 0.5
speedd.speak(voicert)
答案 1 :(得分:0)
尝试这个。
let speaker = AVSpeechSynthesizer()
func say(text: String, language: String) {
// Start audio session
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSession.Category.playAndRecord)
try audioSession.setMode(AVAudioSession.Mode.default)
try audioSession.setActive(true)
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSession.PortOverride.speaker)
} catch {
return
}
if speaker.isSpeaking {
speaker.stopSpeaking(at: .immediate)
} else {
myUtterance = AVSpeechUtterance(string: text)
myUtterance.rate = AVSpeechUtteranceDefaultSpeechRate
myUtterance.voice = AVSpeechSynthesisVoice(language: language)
myUtterance.pitchMultiplier = 1
myUtterance.volume = 2
DispatchQueue.main.async {
self.speaker.speak(myUtterance)
}
}
}