实时语音识别连续模式
前提条件
- 确保已经按照配置好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 | Boolean | 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()
}
} 
