
# 一句话识别
#### 前提条件
- 确保已经按照配置好iOS开发环境。
- 已经保存好1分钟内音频文件，建议使用16k16bit进行录音并保存为wav格式。
- 请参考[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)获取最新版本SDK包。
 
#### 初始化Client
初始化SASRClient，参数为AuthInfo，详见[表1]。
 表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)。 |
   
#### 请求参数
请求类为SASRConfig和语音数据data，详见[表2]。
 表2SASRConfig 
| 参数名称   | 是否必选 | 参数类型                                              | 描述                                 |
|:---|:---|:---|:---|
| config | 是    | [Config] object | 配置信息。                              |
| data   | 是    | String                                            | 本地音频文件经过Base64编码后的字符串，音频文件时长小于60s。 |
   
 表3Config 
| 参数名称         | 是否必选 | 参数类型   | 描述                                                                                                                                |
|:---|:---|:---|:---|
| audioFormat  | 是    | String | 音频格式，具体信息请参见《API参考》中[一句话识别](https://support.huaweicloud.com/api-sis/sis_03_0040.html)章节。                                          |
| property     | 是    | String | 属性字符串，语言_采样率_模型，如chinese_16k_general。具体信息请参见《API参考》中[一句话识别](https://support.huaweicloud.com/api-sis/sis_03_0040.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)章节。 |
   
#### 响应参数
响应类为SASRResponse，详见[表4]。调用失败处理方法请参见[错误码](https://support.huaweicloud.com/api-sis/sis_03_0045.html)。
 表4SASRResponse 
| 参数名     | 是否必选 | 参数类型       | 说明                                                                                                 |
|:---|:---|:---|:---|
| traceId | 是    | String     | 服务内部的令牌，可用于在日志中追溯具体流程，调用失败无此字段。 在某些错误情况下可能没有此令牌字符串。 |
| result  | 是    | SASRResult | 调用成功表示识别结果，调用失败时无此字段。请参考[表5]。                                     |
   
 表5SASRResult 
| 参数名   | 是否必选 | 参数类型   | 说明                       |
|:---|:---|:---|:---|
| text  | 是    | String | 调用成功表示识别出的内容。            |
| score | 是    | Float  | 调用成功表示识别出的置信度，取值范围：0\~1。 |
   
#### 代码示例
如下示例仅供参考，最新代码请前往[SDK（websocket）](https://support.huaweicloud.com/sdkreference-sis/sis_05_0004.html)章节获取并运行。
```
import SwiftUI
import AVFoundation
import SIS
struct Config {
  
    static let region = "cn-north-4"
    static let projectId = ""
}
class HTTPClientDelegate: HTTPDelegate, ObservableObject {
    @Published var result = ""
    func onMessage(response: SASRResponse) {
        self.result = response.result.text
    }
    func onError(response: SASRErrorResponse) {
        self.result = response.errorMsg
    }
}
enum STATE {
    case IDLE
    case RECORDING
}
struct SASRView: View {
    @ObservedObject var delegate = HTTPClientDelegate()
    @State var client: SASRClient?
    @State var recordStatus = STATE.IDLE
    @State var recorder: AudioFileRecorder?
    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)
                self.client = SASRClient(auth: authInfo)
                self.client!.delegate = self.delegate
                self.recorder = AudioFileRecorder()
                self.recorder?.start()
                self.delegate.result = ""
                self.recordStatus = .RECORDING
            }
            .buttonStyle(.borderedProminent)
            .disabled(self.recordStatus == .RECORDING)
            Button("停止录音") {
                self.recorder?.stop()
                let filePath = self.recorder?.filePath
                let binData = try! Data(contentsOf: URL(fileURLWithPath: filePath!))
                let base64Data = binData.base64EncodedData()
                let strData = String(decoding: base64Data, as: UTF8.self)
                var config = SASRConfig()
                config.addPunc = "yes"
                config.digitNorm = "no"
                let sasrRequest = SASRRequest(config: config, data: strData)
                self.client!.transcribe(request: sasrRequest)
                self.recordStatus = .IDLE
            }
            .buttonStyle(.borderedProminent)
            .disabled(self.recordStatus == .IDLE)
            Text(delegate.result)
        }
        .padding()
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        SASRView()
    }
}
```
