Сегодня мы будем переводить речь в текст. Сначал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...» на:
ContentView — это то, что показываем на экране. SpeechRec — это где мы будем переводить речь в текст. Распознанный текст будем держать на recognizedText, а ContentView будет отображать это на экране.
Для начала нам нужно спросить разрешение у пользователя. Выберите файл Info.plist и добавьте туда два ключа: NSSpeechRecognitionUsageDescription и NSMicrophoneUsageDescription.
Импортируем Speech и спрашиваем разрешение:
Если запустить, будет спрашивать разрешение:
.
Чтобы перевести речь в текст, нам надо использовать SFSpeechRecognizer с локализацией «ru-Ru» для распознавания русской речи. Потом нужно указать источник, в нашем случае это поток от микрофона.
Последняя версия нашего класса:
После того, как спросили разрешение, сразу же начинается процесс распознавания. Я постарался написать кратко и поэтому пропустил некоторые необходимые проверки.
Теперь запустите и скажите что нибудь на русском. Ваша речь будет отображаться на экране.
.
Документация:
developer.apple.com/documentation/speech
WWDC видео:
developer.apple.com/videos/all-videos/?q=Speech
GitHub проект:
github.com/usenbekov/speech-to-text-demo
Если вы не знаете, что такое 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 видео:
developer.apple.com/videos/all-videos/?q=Speech
GitHub проект:
github.com/usenbekov/speech-to-text-demo