9Внедрение распознавания речи Nuance в Swift, не может прослушивать события onResult, onError...

У меня есть две части моего проекта Speech Recon с Nuance, файл.h модуля (ObjectiveC) иViewController (Быстрый).

Я хочу создатьSpeechRecognition объект в моем быстромviewControllerи слушать onBegin, onStop... и такие методы.

Единственный способ сделать его компилируемым - использовать nil в качестве параметра делегата для инициализации объекта SpeechRecon. Очевидно, что это не хорошо, потому что мои функции onStart... и onFinish не срабатывают.

Я реализовал протокол кSKRecogniser файл и расширил мой класс ViewController до SKReconDelegate... но если я использую "self" в качестве делегата для инициализации объекта, компилятор скажет, чтоUIViewController не является допустимым классом. Я знаю, что мне нужно установить делегата между обоими классами, но я разработчик для Android, и мои навыки iOS все еще недостаточно остры. Вот код, если я пропустил какую-то важную часть, просто дайте мне знать. Я буду очень благодарен за вашу помощь.

//ViewController code, in SWIFT
//NO PROTOCOLS NEEDED HERE!

class ViewController:  UIViewController, SpeechKitDelegate, SKRecognizerDelegate{

override func viewDidLoad() {
        super.viewDidLoad()
        SpeechKit.setupWithID( "NMDPTRIAL_nuance_chch_com9999",
            host:"sandbox.nmdp.nuancemility.net",
            port:443,
            useSSL:false,
            delegate:self) //error said "self" is of an invalid ViewController type :( because I was NOT implementing all 4 methods BELOW:
   }
//a bit ahead, I have the same problem with a button
@IBAction func btnmicaction(sender: AnyObject) {
   self.voiceSearch=SKRecognizer(type: "websearch", detection: 2, language: langType as String, delegate: self) //error said "self" is of an invalid ViewController type :( because I was NOT implementing all 4 methods BELOW:
   }


//IMPLEMENT ALL THESE 4 FUNCTIONS, AS SUGGESTED BY THE SOLUTION
func recognizerDidBeginRecording(recognizer:SKRecognizer){
        println("************** ReconBeganRecording")
        }

func recognizerDidFinishRecording(recognizer:SKRecognizer){
        println("************** ReconFinishedRecording")
        }

func recognizer(recognizer: SKRecognizer!, didFinishWithResults results: SKRecognition!){
    //The voice recognition process has understood something
    }

func recognizer(recognizer: SKRecognizer!, didFinishWithError error: NSError!, suggestion: String!){
   //an error has occurred
   }
}

На всякий случай вот мой заголовок Bridge:

#ifndef Vanilla_Bridge_h
#define Vanilla_Bridge_h
#import <SpeechKit/SpeechKit.h>

ОБНОВЛЕНИЕ СМ. РЕШЕНИЕ НИЖЕ!!

3 ответа

Решение

Вот что у меня есть Bridging Header:

#import <SpeechKit/SpeechKit.h>
#import "NuanceHeader.h"

NuanceHeader.h:

#import <Foundation/Foundation.h>
@interface NuanceHeader : NSObject
@end

NuanceHeader.m

#import "NuanceHeader.h"
const unsigned char SpeechKitApplicationKey[] = {...};
@implementation NuanceHeader
@end

Когда дело доходит до UIViewController, который использует все это:

class MyViewController: UIViewController, SpeechKitDelegate, SKRecognizerDelegate
{
    var voiceSearch: SKRecognizer?

    override func viewDidLoad()
    {
       //Setup SpeechKit
       SpeechKit.setupWithID("...", host: "sandbox.nmdp.nuancemobility.net", port: 443, useSSL: false, delegate: self)
    }

    func someAction()
    {
        self.voiceSearch = SKRecognizer(type: SKSearchRecognizerType, detection: UInt(SKLongEndOfSpeechDetection), language:"eng-USA", delegate: self)

    }

    func recognizerDidBeginRecording(recognizer: SKRecognizer!)
    {
        //The recording has started
    }

    func recognizerDidFinishRecording(recognizer: SKRecognizer!)
    {
        //The recording has stopped
    }

    func recognizer(recognizer: SKRecognizer!, didFinishWithResults results: SKRecognition!)
    {
        //The voice recognition process has understood something
    }

    func recognizer(recognizer: SKRecognizer!, didFinishWithError error: NSError!, suggestion: String!)
    {
       //an error has occurred
    }
}

Там нет ничего другого, проверьте каждый шаг, эта часть довольно проста

Пытаться let objCDelegate = self as SKRecognizerDelegate а затем использовать objCDelegate в качестве параметра делегата

Поскольку вещи немного изменились, я подумал, что добавлю свои 2 цента:

 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
}

надеюсь, это поможет кому-то!

Другие вопросы по тегам