рдЖрдЬ рд╣рдо рднрд╛рд╖рдг рдХрд╛ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ iOS рдФрд░ Xcode рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рд╣реИ ред рд╕реНрдкреАрдЪ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо iOS 10 рдХреА рдЬрд░реВрд░рдд рд╣реИ ред рдореИрдВрдиреЗ SwiftUI рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ , рдЗрд╕рдХреЗ рд▓рд┐рдП iOS 13 рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдЖрдк рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редрдпрджрд┐ рдЖрдк рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдПрдХ рддреНрд╡рд░рд┐рдд рдЕрд╡рд▓реЛрдХрди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рдЖрдк рд╣реИрдВ редрдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ "рдлрд╛рдЗрд▓> рдирдпрд╛> рдкреНрд░реЛрдЬреЗрдХреНрдЯ ..." рдмрдирд╛рдПрдВ , "рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдРрдк" рдФрд░ "рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕: рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ" рдЪреБрдиреЗрдВ ред рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
рдПрдХ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВContentView.swift рдФрд░ "рд╕рдВрд░рдЪрдирд╛рддреНрдордХ 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 = "!"
}
}
рд╕рд╛рдордЧреНрд░реА рдЬреЛ рд╣рдо рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред SpeechRec рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдо рднрд╛рд╖рдг рдХреЛ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВрдЧреЗред рд╣рдо рдХрд┐рд╕реА рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдкрд╛рда рдХреЛ рдХрд┐рд╕реА рдорд╛рдиреНрдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдкрд╛рда рдкрд░ рд░рдЦреЗрдВрдЧреЗ , рдФрд░ рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛редрд╕рдВрдХрд▓реНрдк
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЕрдиреБрдорддрд┐ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ рд╣реЛрдЧрд╛ред Info.plist рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рд╡рд╣рд╛рдВ рджреЛ рдХреБрдВрдЬреА рдЬреЛрдбрд╝реЗрдВ: NSSpeechRecognitionUsageDescription рдФрд░ NSMicrophoneUsageDescription ред рднрд╛рд╖рдг
рдЖрдпрд╛рдд рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдорддрд┐ рдорд╛рдВрдЧреЗрдВ:import Speech
...
class SpeechRec: ObservableObject {
...
func start() {
SFSpeechRecognizer.requestAuthorization { status in
}
}
}
рдпрджрд┐ рдЖрдк рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЕрдиреБрдорддрд┐ рдорд╛рдВрдЧреЗрдЧрд╛
:редрднрд╛рд╖рдг рдХреЛ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ
рднрд╛рд╖рдг рдХреЛ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд░реВрд╕реА рднрд╛рд╖рдг рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдпрдХрд░рдг "рдЖрд░рдпреВ-рдЖрд░рдпреВ" рдХреЗ рд╕рд╛рде SFSpeechRecognizer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рдлрд┐рд░ рдЖрдкрдХреЛ рд╕реНрд░реЛрдд рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдорд╛рдЗрдХреНрд░реЛрдлрд╝реЛрди рд╕реЗ рдПрдХ рдзрд╛рд░рд╛ рд╣реИред рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХрд╛ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг:...
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/speechWWDC рд╡реАрдбрд┐рдпреЛ:developer.apple.com/videos/all-videos/?q=SpeechGitHub рдкрд░рд┐рдпреЛрдЬрдирд╛:github.com/usenbekov/speech-to-text-demo