Перевести речь в текст на iOS используя Speech framework

от автора

Сегодня мы будем переводить речь в текст и покажем это на экране. Сначалa убедитесь, что у вас стоит последняя версия iOS и Xcode. Для Speech Framework нужна минимум iOS 10. Я создал проект с поддержкой SwiftUI, для этого нужна iOS 13. Это не обязательно, можете использовать Storyboard.

Если вы не знаете что такое SwiftUI и хотите быстрый обзор, то вам сюда.

Создайте новый проект “File > New > Project…”, выберите “Single View App” и “User Interface: SwiftUI”. Проект будет выглядеть примерно так:

Выбираем файл ContentView.swift и меняем «struct ContentView…» на:

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 — это то, что показываем на экране. SpeechRec — это где мы будем переводить речь в текст. Распознанный текст будем держать на recognizedText, а ContentView будет отображать это на экране.

Разрешение

Для начала нам нужно спросить разрешение у пользователя. Выберите файл Info.plist и добавьте туда два ключа: NSSpeechRecognitionUsageDescription и NSMicrophoneUsageDescription.

Импортируем Speech и спрашиваем разрешение:

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

Если запустить, будет спрашивать разрешение:


.

Перевести речь в текст

Чтобы перевести речь в текст нам надо использовать SFSpeechRecognizer с локализацией «ru-Ru», для распознавания русской речи. Потом нужно указать источник, в нашем случае это поток от микрофона.

Последняя версия нашего класса:

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

После того, как спросили разрешение, мы сразу же начали процесс распознавания. Я постарался написать кратко и поэтому пропустил некоторые необходимые проверки.

Теперь запустите и скажите что нибудь на русском, ваша речь будет отображаться на экране.


.

Что дальше?

Документацию можно найти здесь:
developer.apple.com/documentation/speech

WWDC видео про Speech framework:
developer.apple.com/videos/all-videos/?q=Speech

Ссылка на github проект находится здесь:
github.com/usenbekov/speech-to-text-demo

ссылка на оригинал статьи https://habr.com/ru/post/487890/