Traducir voz a texto en iOS usando el marco de voz

Hoy traduciremos el discurso en texto. Primero, asegúrese de tener instalada la última versión de iOS y Xcode . Para Speech Framework necesita al menos iOS 10 . Creé un proyecto con soporte SwiftUI , esto requiere iOS 13 . Pero esto no es necesario, puedes usar el Storyboard .

Si no sabe qué es SwiftUI y desea una descripción general rápida, aquí está .

Cree un nuevo proyecto "Archivo> Nuevo> Proyecto ..." , seleccione "Aplicación de vista única" e "Interfaz de usuario: SwiftUI" . El proyecto se verá así:



Seleccione un archivoContentView.swift y cambia "struct ContentView ..." a:

struct ContentView: View {
    @ObservedObject var speechRec = SpeechRec()
    var body: some View {
        Text(speechRec.recognizedText)
            .onAppear {
                self.speechRec.start()
        }
    }
}

class SpeechRec: ObservableObject {
    @Published private(set) var recognizedText = ""
    func start() {
        recognizedText = "!"
    }
}


ContentView es lo que mostramos en la pantalla. SpeechRec es donde traduciremos el discurso en texto. Mantendremos el texto reconocido en un texto reconocido , y ContentView lo mostrará en la pantalla.

Resolución


Primero, debemos pedirle permiso al usuario. Seleccione el archivo Info.plist y agregue dos claves allí: NSSpeechRecognitionUsageDescription y NSMicrophoneUsageDescription .



Importar voz y pedir permiso:

import Speech
...
class SpeechRec: ObservableObject {
    ...
    func start() {
        SFSpeechRecognizer.requestAuthorization { status in
            
        }
    }
}


Si se ejecuta, será pedir permiso:


.

Traducir voz a texto


Para traducir la voz en texto, necesitamos usar SFSpeechRecognizer con la localización "ru-Ru" para reconocer la voz rusa. Luego debe especificar la fuente, en nuestro caso es una transmisión desde el micrófono.

Última versión de nuestra clase:

...

class SpeechRec: ObservableObject {
    @Published private(set) var recognizedText = ""
    
    let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "ru-RU"))
    var recognitionRequest: SFSpeechAudioBufferRecognitionRequest?
    var recognitionTask: SFSpeechRecognitionTask?
    let audioEngine = AVAudioEngine()
    
    func start() {
        self.recognizedText = "..."
        SFSpeechRecognizer.requestAuthorization { status in
            self.startRecognition()
        }
    }
    
    func startRecognition() {
        do {
            recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
            guard let recognitionRequest = recognitionRequest else { return }
            
            recognitionTask = speechRecognizer?.recognitionTask(with: recognitionRequest) { result, error in
                if let result = result {
                    self.recognizedText = result.bestTranscription.formattedString
                }
            }
            
            let recordingFormat = audioEngine.inputNode.outputFormat(forBus: 0)
            audioEngine.inputNode.installTap(onBus: 0, bufferSize: 1024, format: recordingFormat) { buffer, _ in
                recognitionRequest.append(buffer)
            }
            
            audioEngine.prepare()
            try audioEngine.start()
        }
        
        catch {
            
        }
    }
}


Después de pedir permiso, el proceso de reconocimiento comienza de inmediato. Traté de escribir brevemente y, por lo tanto, omití algunos controles necesarios.

Ahora corre y di algo en ruso. Su discurso se mostrará en la pantalla.


.

¿Que sigue?


Documentación:
developer.apple.com/documentation/speech

Video WWDC:
developer.apple.com/videos/all-videos/?q=Speech

Proyecto GitHub:
github.com/usenbekov/speech-to-text-demo

Source: https://habr.com/ru/post/undefined/


All Articles