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