Speech Recognizer API – co musisz wiedzieć?

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). Poznaj możliwości tego narzędzia i sprawdź, jak je wykorzystać w praktyce.
SFSpeechRecognizer API
Api umożliwia analizę ponad 50 języków, dlatego warto . Wykorzystanie SFSpeechRecognizer API w aplikacji jest bardzo proste i w zasadzie sprowadza się do czterech kroków.
Krok 1. Dodanie do pliku info.plist odpowiednich kluczy wraz z ich opisami
- NSSpeechRecognitionUsageDescription – to klucz informujący o tym, do czego będziemy wykorzystywać w aplikacji SFSpeechRecognizer;
- NSMicrophoneUsageDescription – niezbędny w przypadku, kiedy wykorzystujemy mikrofon, aby analizować mowę na żywo.
Krok 2. 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:
//..
}
}
}
Krok 3. 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 (przy użyciu 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.