我正在尝试语音识别样本.如果我开始通过麦克风识别我的演讲,那么我试图让iPhone听到那个公认的文字.这是工作.但是,声音太低了.你可以指导我吗?
而不是,如果我尝试简单的按钮操作,使用AVSpeechUtterance代码,音量是正常的.
之后,如果我选择startRecognise()方法,音量太低.
我的守则
func startRecognise()
{
let audioSession = AVAudioSession.sharedInstance() //2
do
{
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try audioSession.setMode(AVAudioSessionModeDefault)
try audioSession.setMode(AVAudioSessionModeMeasurement)
try audioSession.setActive(true, with: .notifyOthersOnDeactivation)
try AVAudioSession.sharedInstance().overrideOutputAudioPort(AVAudioSessionPortOverride.speaker)
}
catch
{
print("audioSession properties weren't set because of an error.")
}
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
guard let inputNode = audioEngine.inputNode else {
fatalError("Audio engine has no input node")
}
guard let recognitionRequest = recognitionRequest else {
fatalError("Unable to create an SFSpeechAudioBufferRecognitionRequest object")
}
recognitionRequest.shouldReportPartialResults = true
recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest, …Run Code Online (Sandbox Code Playgroud) avaudioplayer ios avspeechsynthesizer swift sfspeechrecognizer
我已更新到 macOS Monterrey,但我的 SFSPeechRecognizer 代码刚刚损坏。如果我尝试为 macOS 配置离线语音识别器,我会收到此错误
\nError Domain=kLSRErrorDomain Code=102 "Failed to access assets" UserInfo={NSLocalizedDescription=Failed to access assets, NSUnderlyingError=0x6000003c5710 {Error Domain=kLSRErrorDomain Code=102 "No asset installed for language=es-ES" UserInfo={NSLocalizedDescription=No asset installed for language=es-ES}}}\nRun Code Online (Sandbox Code Playgroud)\n这是演示项目中的代码片段:
\nprivate func process(url: URL) throws {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0speech = SFSpeechRecognizer.init(locale: Locale(identifier: "es-ES"))\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0speech.supportsOnDeviceRecognition = true\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0let request = SFSpeechURLRecognitionRequest(url: url)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0request.requiresOnDeviceRecognition = true\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0request.shouldReportPartialResults = false\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0speech.recognitionTask(with: request) { result, error in\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0guard let result = result else {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if let error = error {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0print(error)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if let error = error {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0print(error)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if result.isFinal {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0print(result.bestTranscription.formattedString)\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0}\n\xc2\xa0\xc2\xa0}\nRun Code Online (Sandbox Code Playgroud)\n … 我有一个从Apple的示例应用程序设置的SFSpeechRecognizer https://developer.apple.com/library/content/samplecode/SpeakToMe/Introduction/Intro.html
我想知道是否有可能让识别器识别出与其他先前识别的单词无关的单个单词.
例如,当发出"Scroll"时,识别器现在会尝试形成一个句子然后找到有意义的单词的最佳转录,所以当发出"Stop"时,它会将其改为像"Down"这样的东西.在前一个词的上下文中更有意义.
但这不是我想要的,因为我希望我的应用程序能够将单个单词作为在侦听时调用函数的命令.
有没有办法以这样一种方式实现框架:它会不断地听取单词并且只捕获单个单词?
我使用 SFSpeechRecognizer,基本上可以工作。
1.但有时会出现以下错误。并且主要是在我没有执行之前avStop()。
[Utility] +[AFAggregator logDictationFailedWithError:] Error Domain=kAFAssistantErrorDomain Code=203 "Retry" UserInfo={NSLocalizedDescription=Retry, NSUnderlyingError=0x1c464b880 {Error Domain=SiriSpeechErrorDomain Code=1 "(null)"}}
2.并且完全无法后台工作,会产生如下错误。
[Utility] +[AFAggregator logDictationFailedWithError:] 错误域=kAFAssistantErrorDomain Code=1700 "(null)"
class MySpeech:NSObject{
private var iosRecognizer: SFSpeechRecognizer?
private var iosRequest: SFSpeechAudioBufferRecognitionRequest?
private var iosTask: SFSpeechRecognitionTask?
private let iosAVE = AVAudioEngine()
private let avSession = AVAudioSession.sharedInstance()
func avINIT(){
try? avSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.allowBluetooth])
try? avSession.setMode(AVAudioSessionModeMeasurement)
try? avSession.setActive(true, with: .notifyOthersOnDeactivation)
}
func switchHFP(){
do{
//try avSession.setActive(false)
try avSession.setCategory(AVAudioSessionCategoryPlayAndRecord, with: [.allowBluetooth])
try avSession.setActive(true, with: .notifyOthersOnDeactivation)
} catch {
debugPrint("HFP error: …Run Code Online (Sandbox Code Playgroud) 我刚刚更新到 macOS 10.15.4,每次检查设备上语音识别是否可用时,都会返回 false。这是在 10.15.3 上运行的。
speechRecognizer?.supportsOnDeviceRecognition = true
print("supportsOnDeviceRecognition: \(String(describing: speechRecognizer?.supportsOnDeviceRecognition))")
Run Code Online (Sandbox Code Playgroud)
还有其他人看到这个吗?有什么技巧可以让它再次工作吗?
我正在使用ios语音识别,只要有足够的上下文,它就会很好.我正在使用语音识别仅用于数字输入并且看到问题.例如,使用单个数字(例如2 - ,或8 - ate); 没有足够的背景.或者甚至有两位数字(80有时被翻译为白痴).我想向语音识别器表明输入将是数字.例如,如果输入是"数字2",那么语音识别器就能完成出色的工作.
我已经玩了一些提示--SFSpeechRecognitionTaskHint(未指定,听写,搜索,确认) - 但这些模式都不适合数字输入.
所以,问题是:
另请注意,我希望这也适用于许多不同的语言(不仅仅是英语).
谢谢你的帮助,埃里克
我们创建了一个使用 Google 语音识别器的 Android 应用程序,我们首先在程序中选择使用 Google 语音识别器。大多数设备工作正常,只有少数设备(MEIZU_M5、U78-E、Apollo Lite 等)报告以下异常。好像和联发科的语音指令有些冲突?我们发现其他一些联发科的设备工作正常。这很混乱。
java.lang.SecurityException: Not allowed to bind to service Intent { act=android.speech.RecognitionService cmp=com.mediatek.voicecommand/.service.VoiceWakeupRecognitionService }
at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:1421)
at android.app.ContextImpl.bindService(ContextImpl.java:1385)
at android.content.ContextWrapper.bindService(ContextWrapper.java:604)
at android.speech.SpeechRecognizer.startListening(SpeechRecognizer.java:287)
Run Code Online (Sandbox Code Playgroud)
为了跟踪代码,源代码只显示到 ContextWrapper.java。如何让它显示到 ContextImpl.java:1421?
通过 firebase 日志,我们发现它发生在许多 3rd 方语音识别器上:
com.mediatek.voicecommand
com.htc.android.voicedictation
com.vlingo.midas
com.iflytek.speechcloud
com.iflytek.speechsuite
...
Run Code Online (Sandbox Code Playgroud)
我们还测试了其他一些运行良好的第 3 方语音识别器。那些导致异常的语音识别器是否仅用于系统语音命令而应用程序无法访问?
欢迎任何想法或经验。
android speech-recognition securityexception device sfspeechrecognizer
当我点击我的应用程序的重置按钮和语音识别时,我反复收到此错误消息.只有当应用程序正在主动收听语音识别时点击按钮才会发生这种情况.该应用程序看起来仍在录制,但它不会再接受任何输入.它也不会让我停止录音.代码如下.
@IBAction func resetTapped(_ sender: Any) {
if audioEngine.isRunning {
audioEngine.stop()
recognitionRequest?.endAudio()
}
globalVariables.tempText = ""
globalVariables.finalText = ""
globalVariables.boolRecording = false
self.inView.text = ""
self.resultView.text = ""
inView.backgroundColor = UIColor.red
}
private let speechRecognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "en-US"))
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var recognitionTask: SFSpeechRecognitionTask?
private let audioEngine = AVAudioEngine()
func startRecording() -> String {
self.inView.text = ""
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
let audioSession = AVAudioSession.sharedInstance()
do {
try audioSession.setCategory(AVAudioSessionCategoryPlayAndRecord)
try audioSession.setMode(AVAudioSessionModeMeasurement) …Run Code Online (Sandbox Code Playgroud) 我已经开始遇到以前没有发生的崩溃,因为记录的初始化有错误:
[avae] AVAEInternal.h:70:_AVAE_Check: required condition is false: [AVAudioIONodeImpl.mm:911:SetOutputFormat: (format.sampleRate == hwFormat.sampleRate)]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,它似乎与使用 48k 而不是 44.1k 的采样率有关。但是,就我而言,使用音频引擎,我根本没有设置任何采样率。
我的代码主要是用于记录的样板。崩溃发生在以下行:
inputNode.installTap(onBus: 0, bufferSize: 4096, format: recordingFormat) { (buffer, when) in
print("got here")//never gets here
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议在使用音频引擎进行录音时如何解决这个问题?
感谢您的任何建议。
编辑
这就是我创建记录格式的方式:
let recordingFormat = inputNode.outputFormat(forBus: 0)
Run Code Online (Sandbox Code Playgroud)
这就是调试器中的 RecordingFormat 的样子..它似乎设置为 44.1k:
po recordingFormat
<AVAudioFormat 0x282b1e580: 1 ch, 44100 Hz, Float32>
Run Code Online (Sandbox Code Playgroud)
inputNode 看起来像这样:
po inputNode
<AVAudioInputNode: 0x280a0eb70>
(lldb) p inputNode
(AVAudioInputNode) $R4 = 0x0000000280a0eb70 {
AVFoundation.AVAudioIONode = {
baseAVAudioNode@0 = <extracting data from …Run Code Online (Sandbox Code Playgroud) 受到这个问题的启发(没有得到答案)。
上下文:我有一个 (swiftUI) 视图,它有 2 个按钮和一个文本字段。一键打开麦克风并使用 SFSpeechrecognizer 将语音转换为文本(并填充文本字段)。然后将其发送到我的服务器,我的应用程序会收到一个响应,该响应通过 AVSpeechSynthesizer 发出。麦克风始终处于打开状态,因为该应用程序应该是对话式的。因此,语音输出被麦克风捕获。
问题:我不想在说出响应时禁用麦克风,因为我通过麦克风控制我的应用程序。是否可以让麦克风(SFSpeechrecognizer)忽略 AVSpeechSynthesizer 所说的语音?Facetime 通过忽略设备播放的音乐来执行类似的操作。
我的语音转文本代码主要是修改了this。
文字转语音片段如下:
let utterance = AVSpeechUtterance(string: serverResponse)
utterance.voice = AVSpeechSynthesisVoice(language: "en-US")
utterance.rate = 0.1
let synthesizer = AVSpeechSynthesizer()
synthesizer.speak(utterance)
Run Code Online (Sandbox Code Playgroud)