文档首页/ 语音交互服务 SIS/ SDK参考/ iOS SDK/ 实时语音识别连续模式
更新时间:2024-12-04 GMT+08:00
分享

实时语音识别连续模式

前提条件

  • 确保已经按照配置好iOS开发环境。
  • 请参考SDK(websocket)获取最新版本SDK包。

初始化Client

初始化RASRClient,参数为AuthInfo和RASRConfig。

表1 AuthInfo

参数名称

是否必选

参数类型

描述

ak

String

用户的ak,可参考AK/SK认证

sk

String

用户的sk,可参考AK/SK认证

region

String

区域,如cn-north-4,参考终端节点

projectId

String

项目ID,同region一一对应,参考获取项目ID

表2 RASRConfig

参数名称

是否必选

参数类型

描述

audioFormat

String

音频格式,SDK内置录音功能只支持pcm16k16bit,参见《API参考》中开始识别章节。

property

String

属性字符串,language_sampleRate_domain, 如chinese_16k_general,参见《API参考》中开始识别章节。

addPunc

String

表示是否在识别结果中添加标点,取值为yes 、 no,默认no。

digitNorm

String

表示是否将语音中的数字识别为阿拉伯数字,取值为yes 、 no,默认为yes。

vocabularyId

String

热词表id,不使用则不填写。

创建热词表请参考《API参考》中创建热词表章节。

interimResults

String

是否输出中间结果,可以为yes或no。默认为no,表示不输出中间结果。

响应参数

结果响应类为RASRResponse,详见表2。调用失败处理方法请参见错误码

表2 RASRResponse

参数名

参数类型

说明

respType

String

参数值为RESULT,表示识别结果响应。

traceId

String

服务内部的令牌,可用于在日志中追溯具体流程。

segments

Array of RASRSentence

多句结果,请参考表3

errorCode

String

错误码。

errorMsg

String

错误描述。

表3 RASRSentence

参数名

参数类型

说明

startTime

Integer

一句的起始时间戳,单位为ms。

endTime

Integer

一句的结束时间戳,单位为ms。

isFinal

Boolen

true表示是最终结果, false表示为中间临时结果。

result

RASRResult

调用成功表示识别结果,调用失败时无此字段。

请参考表4

表4 RASRResult

参数名

参数类型

说明

text

String

识别结果。

score

Float

识别结果的置信度,取值范围:0~1。此值仅会在最终结果时被赋值,在中间结果时统一置为“0.0”

说明:

目前置信度作用不是太大,请勿过多依赖此值。

示例代码

如下示例仅供参考,最新代码请前往SDK(websocket)章节获取并运行。

import SwiftUI
import AVFAudio
import SIS

struct Config {
    static let region = "cn-north-4"
    static let projectId = ""
}

class WebSocketDelegate: NSObject, WebSocketConnectionDelegate, ObservableObject {

    @Published var result = ""
    func onConnected(connection: WebSocketConnection) {
        print("connected")
    }

    func onDisconnected(connection: WebSocketConnection) {
        print("disconnected")
    }

    func onError(connection: WebSocketConnection, error: Error) {
        print(error.localizedDescription)
    }

    func onMessage(connection: WebSocketConnection, response: RASRResponse) {
        if response.respType == "RESULT" {
            self.result = response.segments![0].result.text
        }else if (response.respType == "ERROR"){
            self.result = response.errorMsg!
        }
    }
}

enum STATUS {
    case IDLE
    case TRANSCRIBING
}

struct RASRView: View {
    @ObservedObject var delegate = WebSocketDelegate()
    @State var client: RASRClient?
    @State var status = STATUS.IDLE

    var body: some View {
        VStack {
            Button("开始录音") {
                do {
                    try AVAudioSession.sharedInstance().setCategory(.record)
                    try AVAudioSession.sharedInstance().setActive(true)
                } catch {
                    self.delegate.result = "初始化录音失败"
                    return
                }

                //认证用的AK和SK硬编码在代码中或明文存储都有很大安全风险,建议在配置文件或环境变量中密文存放,使用时解密,确保安全。
                //本示例以AK和SK保存在环境变量中来实现身份验证为例,运行本示例请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
                let ak = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_AK"]!
                let sk = ProcessInfo.processInfo.environment["HUAWEICLOUD_SDK_SK"]!
                let authInfo = AuthInfo(ak: ak, sk: sk, region: Config.region, projectId: Config.projectId)
                var config = RASRConfig()
                config.addPunc = "yes"
                config.digitNorm = "no"
                config.interimResults = "yes"
                self.client = RASRClient(auth: authInfo, config: config)
                self.delegate.result = ""
                self.client?.delegate = self.delegate
                self.client?.start()
                self.status = .TRANSCRIBING
            }
            .buttonStyle(.borderedProminent)
            .disabled(self.status == .TRANSCRIBING)

            Button("停止录音") {
                self.client?.stop()
                self.status = .IDLE
            }
            .buttonStyle(.borderedProminent)
            .disabled(self.status == .IDLE)
            Text(self.delegate.result)
        }
        .padding()
    }
}

struct RealTimeView_Previews: PreviewProvider {
    static var previews: some View {
        RASRView()
    }
}

相关文档