
# 实时语音识别连续模式
#### 前提条件
- 确保已经按照配置好iOS开发环境。
- 请参考[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)获取最新版本SDK包。
 
#### 初始化Client
初始化RASRClient，参数为AuthInfo和RASRConfig。
表1AuthInfo 
| 参数名称      | 是否必选 | 参数类型   | 描述                                                                                     |
|:---|:---|:---|:---|
| ak        | 是    | String | 用户的ak，可参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。 |
| sk        | 是    | String | 用户的sk，可参考[AK/SK认证](https://support.huaweicloud.com/sdkreference-sis/sis_05_0003.html)。 |
| region    | 是    | String | 区域，如cn-north-4，参考[终端节点](https://support.huaweicloud.com/api-sis/sis_03_0004.html)。     |
| projectId | 是    | String | 项目ID，同region一一对应，参考[获取项目ID](https://support.huaweicloud.com/api-sis/sis_03_0008.html)。 |
   
**表2**RASRConfig
| 参数名称           | 是否必选 | 参数类型   | 描述                                                                                                                                   |
|:---|:---|:---|:---|
| audioFormat    | 是    | String | 音频格式，SDK内置录音功能只支持pcm16k16bit，参见《API参考》中[开始识别](https://support.huaweicloud.com/api-sis/sis_03_0030.html)章节。                           |
| property       | 是    | String | 属性字符串，language_sampleRate_domain， 如chinese_16k_general，参见《API参考》中[开始识别](https://support.huaweicloud.com/api-sis/sis_03_0030.html)章节。 |
| addPunc        | 否    | String | 表示是否在识别结果中添加标点，取值为yes 、 no，默认no。                                                                                                     |
| digitNorm      | 否    | String | 表示是否将语音中的数字识别为阿拉伯数字，取值为yes 、 no，默认为yes。                                                                                              |
| vocabularyId   | 否    | String | 热词表id，不使用则不填写。 创建热词表请参考《API参考》中[创建热词表](https://support.huaweicloud.com/api-sis/sis_03_0071.html)章节。    |
| interimResults | 否    | String | 是否输出中间结果，可以为yes或no。默认为no，表示不输出中间结果。                                                                                                  |
   
#### 响应参数
结果响应类为RASRResponse，详见[表2]。调用失败处理方法请参见[错误码](https://support.huaweicloud.com/api-sis/sis_03_0045.html)。
 表2RASRResponse 
| 参数名       | 参数类型                  | 说明                                               |
|:---|:---|:---|
| respType  | String                | 参数值为RESULT，表示识别结果响应。                             |
| traceId   | String                | 服务内部的令牌，可用于在日志中追溯具体流程。                           |
| segments  | Array of RASRSentence | 多句结果，请参考[表3]。 |
| errorCode | String                | 错误码。                                             |
| errorMsg  | String                | 错误描述。                                            |
   
 表3RASRSentence 
| 参数名       | 参数类型       | 说明                                                                                               |
|:---|:---|:---|
| startTime | Integer    | 一句的起始时间戳，单位为ms。                                                                                  |
| endTime   | Integer    | 一句的结束时间戳，单位为ms。                                                                                  |
| isFinal   | Boolean    | true表示是最终结果， false表示为中间临时结果。                                                                     |
| result    | RASRResult | 调用成功表示识别结果，调用失败时无此字段。 请参考[表4]。 |
   
 表4RASRResult 
| 参数名   | 参数类型   | 说明                                                                                                                                    |
|:---|:---|:---|
| text  | String | 识别结果。                                                                                                                                 |
| score | Float  | 识别结果的置信度，取值范围：0\~1。此值仅会在最终结果时被赋值，在中间结果时统一置为"0.0"。 说明： 目前置信度作用不是太大，请勿过多依赖此值。 |
   
#### 示例代码
如下示例仅供参考，最新代码请前往[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)章节获取并运行。
```
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()
    }
}
```
