Traduzir fala para texto no iOS usando a estrutura de fala

Hoje vamos traduzir o discurso em texto. Primeiro, verifique se você tem a versão mais recente do iOS e do Xcode instalada . Para o Speech Framework, é necessário pelo menos o iOS 10 . Criei um projeto com suporte SwiftUI , isso requer iOS 13 . Mas isso não é necessário, você pode usar o Storyboard .

Se você não sabe o que é SwiftUI e deseja uma visão geral rápida, aqui está você .

Crie um novo projeto "Arquivo> Novo> Projeto ..." , selecione "Aplicativo de exibição única" e "Interface do usuário: SwiftUI" . O projeto terá a seguinte aparência:



Selecione um arquivoContentView.swift e altere "struct ContentView ..." para:

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 é o que mostramos na tela. SpeechRec é onde traduziremos a fala em texto. Manteremos o texto reconhecido em um texto reconhecido , e o ContentView exibirá isso na tela.

Resolução


Primeiro, precisamos pedir permissão ao usuário. Selecione o arquivo Info.plist e adicione duas chaves: NSSpeechRecognitionUsageDescription e NSMicrophoneUsageDescription .



Importe Discurso e peça permissão:

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


Se você correr, vai pedir permissão:


.

Traduzir fala para texto


Para traduzir a fala em texto, precisamos usar o SFSpeechRecognizer com a localização "ru-Ru" para reconhecer a fala russa. Então você precisa especificar a fonte, no nosso caso, é um fluxo do microfone.

Versão mais recente da nossa classe:

...

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 {
            
        }
    }
}


Depois de pedir permissão, o processo de reconhecimento começa imediatamente. Tentei escrever brevemente e, portanto, perdi algumas verificações necessárias.

Agora corra e diga algo em russo. Seu discurso será exibido na tela.


.

Qual é o próximo?


Documentação:
developer.apple.com/documentation/speech

Vídeo WWDC:
developer.apple.com/videos/all-videos/?q=Speech

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

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


All Articles