118 lines
3.7 KiB
Swift
118 lines
3.7 KiB
Swift
//
|
||
// ViewController.swift
|
||
// VoskApiTest
|
||
//
|
||
// Created by Niсkolay Shmyrev on 01.03.20.
|
||
// Copyright © 2020-2021 Alpha Cephei. All rights reserved.
|
||
//
|
||
|
||
import UIKit
|
||
import AVFoundation
|
||
|
||
enum WorkMode {
|
||
case stopped
|
||
case microphone
|
||
case file
|
||
}
|
||
|
||
class ViewController: UIViewController {
|
||
|
||
var mode: WorkMode!
|
||
|
||
@IBOutlet weak var recognizeFile: UIButton!
|
||
@IBOutlet weak var mainText: UITextView!
|
||
@IBOutlet weak var recognizeMicrophone: UIButton!
|
||
|
||
var audioEngine : AVAudioEngine!
|
||
var processingQueue: DispatchQueue!
|
||
var model : VoskModel!
|
||
|
||
func setMode(mode: WorkMode) {
|
||
switch mode {
|
||
case .stopped:
|
||
self.recognizeFile.isEnabled = true
|
||
self.recognizeMicrophone.isEnabled = true
|
||
self.recognizeMicrophone.setTitle("Recognize Microphone",for: .normal)
|
||
case .microphone:
|
||
self.recognizeFile.isEnabled = false
|
||
self.recognizeMicrophone.isEnabled = true
|
||
self.recognizeMicrophone.setTitle("Stop Microphone",for: .normal)
|
||
self.mainText.text = ""
|
||
case .file:
|
||
self.recognizeFile.isEnabled = false
|
||
self.recognizeMicrophone.isEnabled = false
|
||
self.mainText.text = "Processing file..."
|
||
}
|
||
self.mode = mode
|
||
}
|
||
|
||
func startAudioEngine() {
|
||
do {
|
||
|
||
// Create a new audio engine.
|
||
audioEngine = AVAudioEngine()
|
||
|
||
let inputNode = audioEngine.inputNode
|
||
let formatInput = inputNode.inputFormat(forBus: 0)
|
||
let formatPcm = AVAudioFormat.init(commonFormat: AVAudioCommonFormat.pcmFormatInt16, sampleRate: formatInput.sampleRate, channels: 1, interleaved: true)
|
||
|
||
let recognizer = Vosk(model: model, sampleRate: Float(formatInput.sampleRate))
|
||
|
||
inputNode.installTap(onBus: 0,
|
||
bufferSize: UInt32(formatInput.sampleRate / 10),
|
||
format: formatPcm) { buffer, time in
|
||
self.processingQueue.async {
|
||
let res = recognizer.recognizeData(buffer: buffer)
|
||
DispatchQueue.main.async {
|
||
self.mainText.text = res + "\n" + self.mainText.text
|
||
}
|
||
}
|
||
}
|
||
|
||
// Start the stream of audio data.
|
||
audioEngine.prepare()
|
||
try audioEngine.start()
|
||
} catch {
|
||
print("Unable to start AVAudioEngine: \(error.localizedDescription)")
|
||
}
|
||
}
|
||
|
||
func stopAudioEngine() {
|
||
audioEngine.stop()
|
||
}
|
||
|
||
@IBAction func runRecognizeMicrohpone(_ sender: Any) {
|
||
if (mode == .stopped) {
|
||
setMode(mode: .microphone)
|
||
startAudioEngine()
|
||
} else {
|
||
stopAudioEngine()
|
||
setMode(mode: .stopped)
|
||
}
|
||
}
|
||
|
||
@IBAction func runRecognizeFile(_ sender: Any) {
|
||
setMode(mode: .file)
|
||
processingQueue.async {
|
||
let recognizer = Vosk(model: self.model, sampleRate: 16000.0)
|
||
let res = recognizer.recognizeFile()
|
||
DispatchQueue.main.async {
|
||
self.mainText.text = res
|
||
self.setMode(mode: .stopped)
|
||
}
|
||
}
|
||
}
|
||
|
||
override func viewDidLoad() {
|
||
super.viewDidLoad()
|
||
setMode(mode: .stopped)
|
||
processingQueue = DispatchQueue(label: "recognizerQueue")
|
||
model = VoskModel()
|
||
}
|
||
|
||
override func didReceiveMemoryWarning() {
|
||
super.didReceiveMemoryWarning()
|
||
}
|
||
}
|
||
|