Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров5.1K
Сегодня мы будем переводить речь в текст. Сначал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 видео:
developer.apple.com/videos/all-videos/?q=Speech

GitHub проект:
github.com/usenbekov/speech-to-text-demo
Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии2

Публикации

Истории

Работа

Swift разработчик
16 вакансий
iOS разработчик
16 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань