阿里云智能语音交互(一句话识别)Swift版本

前言

本文章是对接阿里云的智能语音识别SDK,阿里云官方文档只提供了OC的代码调用示例,所以我整理了下Swift版本,希望能帮助到大家。

一句话识别

一句话识别(https://helpcdn.aliyun.com/document_detail/84622.html?spm=a2c4g.11186623.6.559.wBt2o5)首先也是实时的语音识别,名称定义的来源是识别比较短的语音,适合的使用场景是APP中的语音搜索、语音输入法等,一句话识别单条请求最大支持60秒。

SDK下载导入工程,具体步骤不再说明,详情步骤,请查看阿里云一句话识别iOS SDK(https://helpcdn.aliyun.com/document_detail/84622.html?spm=a2c4g.11186623.6.559.wBt2o5)官方文档。

废话不多说,接下来直接展示代码:

1. Swift类中导入SDK提供的公共类
    /// 智能语音识别
    import NlsSdk.NlsClientAdaptor
    import NlsSdk.RecognizerRequestParam
    import NlsSdk.NlsSpeechRecognizerRequest
2. 创建类
    /// 智能语音识别
    var nlsClient = NlsClientAdaptor()
    var recognizeRequest:NlsSpeechRecognizerRequest?
    var voiceRecorder = NlsVoiceRecorder()
    var recognizeRequestParam = RecognizerRequestParam()
    var recognizerStarted = false
3. 初始化操作,在viewDidLoad()中调用
    /// 智能语音识别
    func voiceRecognition() {
        //1. 全局参数初始化操作
        //1.1 初始化识别客户端,将recognizerStarted状态置为false
        nlsClient = NlsClientAdaptor()
        recognizerStarted = false
        //1.2 初始化录音recorder工具
        voiceRecorder.delegate = self
        //1.3 初始化识别参数类
        recognizeRequestParam = RecognizerRequestParam()
        //1.4 设置log级别
        nlsClient.setLog(nil, logLevel: 1)
    }
4. 开始录音
    ///////////// 智能语音识别 /////////////////////////////////
    func startRecognize() {
        //2. 创建请求对象和开始识别

        //2.1 创建请求对象,设置NlsSpeechRecognizerDelegate回调
        recognizeRequest = nlsClient.createRecognizerRequest()
        recognizeRequest!.delegate = self

        //2.2 设置RecognizerRequestParam请求参数
        recognizeRequestParam.format = "opu"
        recognizeRequestParam.enableIntermediateResult = true
        //请使用https://help.aliyun.com/document_detail/72153.html 动态生成token
        // <AccessKeyId> <AccessKeySecret> 请使用您的阿里云账户生成 https://ak-console.aliyun.com/
        recognizeRequestParam.token = "使用你自己的token"
        recognizeRequestParam.appkey = "使用你自己的appkey"

        //2.3 传入请求参数
        recognizeRequest!.setRecognizeParams(recognizeRequestParam)

        //2.4 启动录音和识别,将recognizerStarted置为true
        voiceRecorder.start(true)
        recognizeRequest!.start()
        recognizerStarted = true

        //2.5 更新UI
        DispatchQueue.main.async {
            print("主线程刷新你的UI操作")
        }
    }
5. 结束录音
    // 结束录音
    func stopVoiceAction(_ sender: UIButton) {
        print("录音结束了。。。。。")
        //3 结束识别 停止录音,停止识别请求
        voiceRecorder.stoprecorder(true)
        recognizeRequest!.stop()
        recognizerStarted = false;
    }
6. 实现代理方法
     /**
     *4. NlsSpeechRecognizerDelegate回调方法
     */
    //4.1 识别回调,本次请求失败
    func onTaskFailed(_ event: NlsDelegateEvent, statusCode: String!, errorMessage eMsg: String!) {
        voiceRecorder.stoprecorder(true)
        print("OnTaskFailed, error message is: \(eMsg)")
    }

    //4.2 识别回调,服务端连接关闭
    func onChannelClosed(_ event: NlsDelegateEvent, statusCode: String!, errorMessage eMsg: String!) {
        voiceRecorder.stoprecorder(true)
        print("OnTaskFailed, error message is: \(statusCode)")
    }

    //4.3 识别回调,识别结果结束
    func onRecognizedCompleted(_ event: NlsDelegateEvent, result: String!, statusCode: String!, errorMessage eMsg: String!) {
        recognizerStarted = false

        // 主线程UI更新代码
        DispatchQueue.main.async {
           print("主线程刷新你的UI操作")
        }
    }

    //4.4 识别回调,识别中间结果
    func onRecognizedResultChanged(_ event: NlsDelegateEvent, result: String!, statusCode: String!, errorMessage eMsg: String!) {

    }


    /**
     *5. 录音相关回调
     */
    func recorderDidStart() {
        print("Did start recorder!")

    }

    func recorderDidStop() {
        print("Did stop recorder!")

    }


    func voiceDidFail(_ error: Error) {
        print("Did recorder error!")
    }

    //5.1 录音数据回调
    func voiceRecorded(_ frame: Data) {
        if (recognizerStarted) {
            //录音线程回调的数据传给识别服务
            recognizeRequest!.sendAudio(frame as Data, length: Int32(frame.count))
        }
    }

    ///////////////////////////////////////

对接过程可能出现的问题:

1. 由于阿里云提供的Demo中,录音类的封装是用OC写的,
  所以直接在Swift项目中import "NlsVoiceRecorder.h" 是无法找到的,
  你需要将该头文件导入在桥接文件中,这样Swift类中才能调用。
2.语音识别过程中汉语数字转阿拉伯文字问题,请看另一篇文章("https://blog.csdn.net/macro_sn/article/details/81778072"

猜你喜欢

转载自blog.csdn.net/macro_sn/article/details/81777719