Перевести речь в текст на 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 и добавьте туда два ключа:

  1. NSSpeechRecognitionUsageDescription.
  2. 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 { } } }

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

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

Что дальше

0
3 комментария
Виктор Просвиряков

В своем примере вы показали как запускать распознавание речи. Это я понял и повторил. Подскажите пожалуйста как остановить распознавание речи в вашем примере. Сделать  функцию Stop При много благодарен.

Ответить
Развернуть ветку
Altynbek
Автор

Обновил GitHub-проект, но если вкратце:
audioEngine.inputNode.removeTap(onBus: 0)
audioEngine.stop()
recognitionRequest?.endAudio()

Ответить
Развернуть ветку
Виктор Просвиряков

Спасибо вам.

Ответить
Развернуть ветку
0 комментариев
Раскрывать всегда