我正在使用iOS 10内置语音识别来攻击一个小项目.我有使用设备麦克风的工作结果,我的语音被非常准确地识别.
我的问题是每个可用的部分转录都会调用识别任务回调,我希望它能够检测到人们停止说话,并在isFinal属性设置为true的情况下调用回调.它没有发生 - 应用程序无限期地倾听.
是SFSpeechRecognizer能够检测句末永远不会消失?
这是我的代码 - 它基于在互联网上找到的示例,它主要是从麦克风源识别所需的样板.我通过添加识别来修改它taskHint.我也设置shouldReportPartialResults为假,但它似乎被忽略了.
func startRecording() {
if recognitionTask != nil {
recognitionTask?.cancel()
recognitionTask = nil
}
let audioSession = AVAudioSession.sharedInstance()
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()
recognitionRequest?.shouldReportPartialResults = false
recognitionRequest?.taskHint = .search
guard let inputNode = audioEngine.inputNode else {
fatalError("Audio engine has no input node") …Run Code Online (Sandbox Code Playgroud) 我在实现语音文本时遇到了这个错误:
因未捕获的异常'com.apple.coreaudio.avfaudio'而终止应用程序,原因:'必需条件为false:_recordingTap == nil'
和:
错误:[0x1b2df5c40]> avae> AVAudioNode.mm:565:CreateRecordingTap:必需条件为false:_recordingTap == nil
这是我的viewController的代码:
public class ViewController: UIViewController, SFSpeechRecognizerDelegate {
// MARK: Properties
private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))!
private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
private var recognitionTask: SFSpeechRecognitionTask?
private let audioEngine = AVAudioEngine()
@IBOutlet var textView : UITextView!
@IBOutlet var recordButton : UIButton!
// MARK: UIViewController
public override func viewDidLoad() {
super.viewDidLoad()
// Disable the record buttons until authorization has been granted.
recordButton.isEnabled = false
}
override public func viewDidAppear(_ animated: Bool) { …Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中实现语音识别.当我第一次使用语音识别逻辑呈现视图控制器时,一切正常.但是,当我再次尝试呈现视图控制器时,我得到以下崩溃:
ERROR: [0x190bf000] >avae> AVAudioNode.mm:568: CreateRecordingTap: required condition is false: IsFormatSampleRateAndChannelCountValid(format)
*** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'required condition is false: IsFormatSampleRateAndChannelCountValid(format)'
Run Code Online (Sandbox Code Playgroud)
以下是用于启动和停止录制的代码:
@available(iOS 10.0, *)
extension DictationViewController {
fileprivate func startRecording() throws {
guard let recognizer = speechRecognizer else {
debugLog(className, message: "Not supported for the device's locale")
return
}
guard recognizer.isAvailable else {
debugLog(className, message: "Recognizer is not available right now")
return
}
mostRecentlyProcessedSegmentDuration = 0
guard let node = audioEngine.inputNode else {
debugLog(className, message: …Run Code Online (Sandbox Code Playgroud) speech-recognition ios avaudioengine swift3 sfspeechrecognizer
因此,我构建了一个使用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 …Run Code Online (Sandbox Code Playgroud) SFSpeechRecognizer我的用例非常不准确.我已经尝试设置contextual字符串,因为我有一个与之匹配的单词数组.但它仍然无法做到这一点.我还需要其他配置吗?
我正在使用Apple提供的示例项目,只有这个改变:
recognitionRequest.contextualStrings = @[@"iron man", @"metal", @"stark", @"superhero", @"boyfriend", @"pepper", @"arrogant", @"stylish"];
Run Code Online (Sandbox Code Playgroud) 我正在研究iOS上的语音识别,但每次调用方法[_recognitionRequest endAudio]时,它总是在recognitionTaskWithRequest中出错:消息在底部.
-(void) stopRecording {
if (_disableSpeechSW == YES) {
return;
}
if (_isAuthorization == NO) {
return;
}
NSLog(@"stopRecording");
if ([_audioEngine isRunning]) {
[_audioEngine stop];
[_recognitionRequest endAudio];
}
Run Code Online (Sandbox Code Playgroud)
}
-(void) startRecording {
..........
[_speechRecognizer recognitionTaskWithRequest:_recognitionRequest
resultHandler:^(SFSpeechRecognitionResult *result,NSError *error){
if (error != nil ) {
NSLog(@"%@",[error description]);
}
else {
..........
}
}];}
Run Code Online (Sandbox Code Playgroud)
[实用程序] + [AFAggregator logDictationFailedWithError:]错误域= kAFAssistantErrorDomain代码= 203"重试"UserInfo = {NSLocalizedDescription =重试,NSUnderlyingError = 0x17424c690 {错误域= SiriSpeechErrorDomain代码= 1"(null)"}}
我正面临一个问题SFSpeechRecognizer.在启动应用程序几秒钟后,我开始收到错误
错误域= kAFAssistantErrorDomain代码= 209"(null)""和"错误域= kAFAssistantErrorDomain代码= 203"超时"UserInfo = {NSLocalizedDescription =超时,NSUnderlyingError = 0x170049990 {错误域= SiriSpeechErrorDomain代码= 100"(null)"}}
并且应用程序停止识别.
我试图endAudio()然后每隔20秒再次启动它,因为Apple不允许我们识别超过一分钟.
任何有关这方面的帮助将非常感激.
根据苹果文件,可以发送的请求数量是有限制的SFSpeechRecognizer。
准备好处理由语音识别限制引起的故障。由于语音识别是一项基于网络的服务,因此会实施限制,以便所有应用程序都可以免费使用该服务。单个设备每天可以执行的识别数量可能受到限制,并且每个应用程序可能会根据每天发出的请求数量进行全局限制。如果识别请求很快失败(启动后一两秒内),请检查识别服务是否变得不可用。如果是,您可能需要要求用户稍后重试。 https://developer.apple.com/documentation/speech/sfspeechrecognizer
另一份文档称,一台设备每小时可以发送 1000 个请求。
设备可以发出的 SFSpeechRecognitionRequest 调用数量的当前速率限制是每小时 1000 个请求。请注意,此限制是针对设备可以发出的请求数量,与发出请求的应用程序无关。这与请求相关的音频长度无关。对于给定的 SFSpeechRecognitionRequest,每个请求最多允许您播放一分钟的音频。
现在我正在创建一个SFSpeechRecognizer如下所示的属性,并检查supportsOnDeviceRecognition指示语音识别器是否可以在没有网络访问的情况下运行的属性。它在我安装了 iOS 13.2.3 的设备上返回true。
let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "en-US"))!
print(speechRecognizer.supportsOnDeviceRecognition) //true
Run Code Online (Sandbox Code Playgroud)
我尝试离线运行我的应用程序,在没有互联网连接的情况下它也可以正常工作。但目前尚不清楚是否仍有请求限制supportsOnDeviceRecognition。在这种情况下,SFSpeechRecognizer即使设备连接到互联网,也可能不会连接到 Apple 服务器,因为这是不必要的。supportsOnDeviceRecognition只有在正确的情况下才会有速率限制吗?
我使用的是iOS 10个新的语音API,和我设置SFSpeechRecognitionRequest的contextualStrings.然而,这些词的概率非常低 - 我猜 - 所以它们没有得到认可.有没有办法让他们更容易被认出来?
我已更新到 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 … ios ×9
iphone ×2
objective-c ×2
sirikit ×2
swift3 ×2
apple-speech ×1
ios13 ×1
macos ×1
siri ×1
swift ×1