28 luty

Speech Recognizer API

W iOS 10 mamy do dyspozycji SFSpeechRecognizer API, które umożliwia transkrypcję w czasie rzeczywistym lub z wcześniej nagranych plików audio. Rezultatem takiej transkrypcji jest nie tylko tekst, ale również alternatywne interpretacje audio, czas trwania wypowiedzianych słów oraz poziom trafności rozpoznanych słów ( skala 0.0 - 1.0 ). Api umożliwia analizę ponad 50 języków. Wykorzystanie SFSpeechRecognizer API w aplikacji jest trywialne, sprowadza się do czterech kroków.

Dodanie do pliku info.plist odpowiednich kluczy wraz z ich opisami
  • a. NSSpeechRecognitionUsageDescription - klucz informujący o tym do czego będziemy wykorzystywać w aplikacji SFSpeechRecognizer
  • b. NSMicrophoneUsageDescription - w przypadku kiedy wykorzystujemy mikrofon aby analizować mowę na żywo
Wywołanie prośby o zezwolenie SFSpeechRecognizer
SFSpeechRecognizer.requestAuthorization { authStatus in
            /*
                The callback may not be called on the main thread. Add an
                operation to the main queue to update the record button's state.
            */
            OperationQueue.main.addOperation {
                switch authStatus {
                    case .authorized:
                         //..
                    case .denied:
                         //..
                    case .restricted:
                         //..
                    case .notDetermined:
                         //..
                }
            }
        }
Utworzenie żądania rozpoznawania mowy

Wyróżniamy dwa typy takiego żądania: SFSpeechURLRecognitionReqest - wykorzystywane do analizy mowy z wcześniej nagranego pliku audio SFSpeechAudioBufferRecognitionRequest - wykorzystywany do analizy mowy na żywo (używając mikrofonu) Dla obu żądań będzie potrzebna klasa SFSpeechRecognizer, aby wykonać analizę mowy.

//..
let speechRecognizer = SFSpeechRecognizer(locale: Locale(identifier: "pl-PL"))
//..
SFSpeechURLRecognitionReqest

Obsługa tego typu żądania sprowadza się do użycia paru linijek kodu:

let fileURL = URL(fileURLWithPath: Bundle.main.path(forResource: "audio", ofType: ".mp3")!)
let request = SFSpeechURLRecognitionRequest(url: fileURL)
SFSpeechAudioBufferRecognitionRequest

Obsługa analizy mowy na żywo wymaga trochę więcej pracy. Dodatkowo należy wykorzystać AVAudioEngine, aby przechwycić mowę z mikrofonu urządzenia. Kolejnym i ostatnim elementem, który jest niezbędny do rozpoznawania mowy jest: SFSpeechRecognitionTask.

//..
recognitionRequest = SFSpeechAudioBufferRecognitionRequest()
        
        guard let inputNode = audioEngine.inputNode else { fatalError("Audio engine has no input node") }
        guard let recognitionRequest = recognitionRequest else { fatalError("Unable to created a SFSpeechAudioBufferRecognitionRequest object") }
        
        // 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
            //..
        }
        
        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()

SFSpeechRecognitionResult zawiera bestTranscription oraz alternatywne transkrypcje.