9Implementing Nuance Speech Recognition on Swift, cannot listen to onResult, onError… events

前端 未结 3 1271
谎友^
谎友^ 2020-12-20 08:57

I have two parts of my Speech Recon project with Nuance, the .h file of a module (ObjectiveC) and aViewController (swift).

I want to set up aSpee

3条回答
  •  臣服心动
    2020-12-20 09:08

    Since things have changed a bit I thought I would add my 2 cents:

     var listening = false
    var transaction: SKTransaction?
    var session: SKSession?
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        session = SKSession(URL: NSURL(string: serverURL), appToken: appKey)
    
        let audioFormat = SKPCMFormat()
        audioFormat.sampleFormat = .SignedLinear16;
        audioFormat.sampleRate = 16000;
        audioFormat.channels = 1;
    
        print("\(NSHomeDirectory())/start.mp3")
    
        // Attach them to the session
        session!.startEarcon = SKAudioFile(URL: NSURL(fileURLWithPath: "\(NSHomeDirectory())/start.mp3"), pcmFormat: audioFormat)
        session!.endEarcon = SKAudioFile(URL: NSURL(fileURLWithPath: "\(NSHomeDirectory())/stop.mp3"), pcmFormat: audioFormat)
    
    }
    
    @IBAction func speechButtonDidClick(sender: AnyObject) {
    
        if listening == false {
            transaction = session?.recognizeWithType(SKTransactionSpeechTypeDictation,
                                                        detection: .Short,
                                                        language: "eng-USA",
                                                        delegate: self)
    
        }else{
            transaction?.stopRecording()
        }
    }
    
    // SKTransactionDelegate
    func transactionDidBeginRecording(transaction: SKTransaction!) {
        messageText.text = "listening"
        listening = true
        indicator.startAnimating()
        startPollingVolume()
    }
    func transactionDidFinishRecording(transaction: SKTransaction!) {
        messageText.text = "stopped"
        listening = false
        indicator.stopAnimating()
        stopPollingVolume()
    }
    
    func transaction(transaction: SKTransaction!, didReceiveRecognition recognition: SKRecognition!) {
    
        print("got something")
    
        //Take the best result
        if recognition.text != nil{
            speechTextField.text = recognition.text
        }
    }
    func transaction(transaction: SKTransaction!, didReceiveServiceResponse response: [NSObject : AnyObject]!) {
        print ("service response")
        print(response)
    }
    func transaction(transaction: SKTransaction!, didFinishWithSuggestion suggestion: String!) {
    }
    func transaction(transaction: SKTransaction!, didFailWithError error: NSError!, suggestion: String!) {
        print ("error")
        print(error)
    }
    
    
    var timer = NSTimer()
    var interval = 0.01;
    
    func startPollingVolume() {
        timer = NSTimer.scheduledTimerWithTimeInterval(interval,
                                                       target: self,
                                                       selector: #selector(ViewController.pollVolume),
                                                       userInfo: nil,
                                                       repeats: true)
    }
    
    func pollVolume() {
        if transaction != nil{
            let volumeLevel:Float = transaction!.audioLevel
            audioLevelIndicator.progress = volumeLevel / 90
        }
    }
    
    func stopPollingVolume() {
        timer.invalidate()
        audioLevelIndicator.progress = 0
    }
    

    hope this helps someone!

提交回复
热议问题