Reconocimiento de voz Siri Habla

En WWDC 2016, Apple presentó una API de reconocimiento de voz muy útil, el marco Speech. El marco de voz puede ayudarlo a integrar rápidamente las funciones de entrada de voz en la aplicación.
Vídeo de encuadre del discurso de la WWDC de 2016

El proceso de integración simple se describe a continuación.
1 Obtener información de autorización de la APLICACIÓN
: uso del micrófono NSMicrophoneUsageDescription
: reconocimiento de voz NSSpeechRecognitionUsageDescription
puede configurar la solicitud de información de solicitud de autorización para los dos valores clave anteriores a través del archivo de información o agregarlo en el archivo info.plist original.

<key>NSMicrophoneUsageDescription</key>  <string>Your microphone will be used to record your speech when you press the &quot;Start Recording&quot; button.</string>

<key>NSSpeechRecognitionUsageDescription</key>  <string>Speech recognition will be used to determine which words you speak into this device&apos;s microphone.</string>

2 Para implementar Speech,
primero debe importarlo en el archivo Swift

import Foundation
import UIKit
import Speech
import AudioToolbox
import AVFoundation

A continuación, cree un objeto de instancia para el reconocimiento de voz.

// MARK: Properties

    private let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "zh_CN"))!

    private var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?

    private var recognitionTask: SFSpeechRecognitionTask?

    private var audioEngine = AVAudioEngine()

    private var result = ""

    public var delegate: BDPSpeechDelegate?

    private var timer : Timer?

Reconocimiento de voz de inicio

    public func startRecording() throws {

        self.checkSpeech()

        // Cancel the previous task if it's running.
        if let recognitionTask = recognitionTask {
            recognitionTask.cancel()
            self.recognitionTask = nil
        }

        let audioSession = AVAudioSession.sharedInstance()
        try audioSession.setCategory(AVAudioSessionCategoryRecord)
        try audioSession.setMode(AVAudioSessionModeMeasurement)
        try audioSession.setActive(true, with: .notifyOthersOnDeactivation)

        recognitionRequest = SFSpeechAudioBufferRecognitionRequest()

        guard let inputNode = audioEngine.inputNode else {
            print("Audio engine has no input node")
            return
        }

        guard let recognitionRequest = recognitionRequest else {
            print("Unable to created a SFSpeechAudioBufferRecognitionRequest object")
            return
        }

        if  inputNode.numberOfInputs > 0 {

            // Configure request so that results are returned before audio recording is finished
            recognitionRequest.shouldReportPartialResults = true

            // A recognition task represents a speech recognition session.
            // We keep a reference to the task so that it can be cancelled.
            recognitionTask = speechRecognizer.recognitionTask(with: recognitionRequest) { result, error in
                var isFinal = false

                if let result = result {
                    if !result.isFinal &&  result.bestTranscription.formattedString != "" {
                        // if did't get any voice input after 1 second, auto end audioEngine
                        self.timer = Timer.scheduledTimer(withTimeInterval: 2.0, repeats: false, block: { (timer) in
                            self.audioEngine.stop()
                            self.recognitionRequest?.endAudio()
                            self.audioEngine.inputNode?.removeTap(onBus: 0)
                        })
                    } else {
                        self.timer?.invalidate()
                        self.timer = nil
                    }

                    isFinal = result.isFinal

                    self.delegate?.voiceChanged(result: result.bestTranscription.formattedString)
                    self.result = result.bestTranscription.formattedString
                    print("---isFinal", isFinal, result.bestTranscription.formattedString, self.result == result.bestTranscription.formattedString)

                    if isFinal {
                        self.delegate?.didStopRecording(result: result.bestTranscription.formattedString)
                    }
                }

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

                    self.recognitionRequest = nil
                    self.recognitionTask = nil

                    self.timer?.invalidate()
                    self.timer = nil
                    print("---audioEngine stoped", isFinal)
                    self.delegate?.speechTaskError()
                }
            }

            let recordingFormat = inputNode.outputFormat(forBus: 0)

            inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { (buffer: AVAudioPCMBuffer, when: AVAudioTime) in
                self.recognitionRequest?.append(buffer)
            }
            audioEngine.prepare()

            try audioEngine.start()

            self.result = ""
        }
    }

始录音和停止录音的方法

// MARCA: Iniciar registro

public func record() {
    try! startRecording()
    if audioEngine.isRunning {
        print("---- Speech start recording")
    }
}

// MARK:  Stop record

public func stop() {
    if audioEngine.isRunning {
        audioEngine.stop()
        recognitionRequest?.endAudio()
        audioEngine.inputNode?.removeTap(onBus: 0)

        audioEngine.reset()

        self.timer?.invalidate()
        self.timer = nil
        print("---- Speech end recording")
    }
}
public protocol SpeechDelegate {
    func didStopRecording(result: String)
    func voiceChanged(result: String)
    func authorizeDenied()
    func speechTaskError()
}

Finalmente, vale la pena señalar que
Apple tiene límites sobre lo que puede reconocer por dispositivo. Se desconocen los detalles, pero puede intentar comunicarse con Apple para obtener más información.
Apple también tiene límites en lo que reconoce cada aplicación.
Si sigues encontrando restricciones, asegúrate de contactar a Apple y es posible que puedan resolver el problema.
El reconocimiento de voz consume mucha energía y tráfico.
El reconocimiento de voz solo dura alrededor de un minuto a la vez.

La tasa de precisión de Siri Speech para el reconocimiento de chino es muy pobre. Apenas se puede escuchar algún vocabulario no profesional. La
estabilidad de Siri Speech también es muy baja. La eficiencia de reconocimiento es diferente en diferentes modelos. A veces se puede reconocer y a veces no se puede reconocer en las mismas condiciones.
Siri Speech tiene altos requisitos en la red y, debido a razones del servidor, a menudo no se obtienen los resultados devueltos.

Supongo que te gusta

Origin blog.csdn.net/sinat_15735647/article/details/78227093
Recomendado
Clasificación