实时语音识别连续模式
前提条件
- 确保已经按照配置好iOS开发环境。
- 请参考SDK(websocket)获取最新版本SDK包。
初始化Client
初始化RASRClient,参数为AuthInfo和RASRConfig。
参数名称 |
是否必选 |
参数类型 |
描述 |
---|---|---|---|
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。调用失败处理方法请参见错误码。
参数名 |
参数类型 |
说明 |
---|---|---|
respType |
String |
参数值为RESULT,表示识别结果响应。 |
traceId |
String |
服务内部的令牌,可用于在日志中追溯具体流程。 |
segments |
Array of RASRSentence |
多句结果,请参考表3。 |
errorCode |
String |
错误码。 |
errorMsg |
String |
错误描述。 |
参数名 |
参数类型 |
说明 |
---|---|---|
startTime |
Integer |
一句的起始时间戳,单位为ms。 |
endTime |
Integer |
一句的结束时间戳,单位为ms。 |
isFinal |
Boolen |
true表示是最终结果, false表示为中间临时结果。 |
result |
RASRResult |
调用成功表示识别结果,调用失败时无此字段。 请参考表4。 |
示例代码
如下示例仅供参考,最新代码请前往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() } }