前言
本文章是对接阿里云的智能语音识别SDK,阿里云官方文档只提供了OC的代码调用示例,所以我整理了下Swift版本,希望能帮助到大家。
一句话识别
一句话识别(https://helpcdn.aliyun.com/document_detail/84622.html?spm=a2c4g.11186623.6.559.wBt2o5)首先也是实时的语音识别,名称定义的来源是识别比较短的语音,适合的使用场景是APP中的语音搜索、语音输入法等,一句话识别单条请求最大支持60秒。
SDK下载导入工程,具体步骤不再说明,详情步骤,请查看阿里云一句话识别iOS SDK(https://helpcdn.aliyun.com/document_detail/84622.html?spm=a2c4g.11186623.6.559.wBt2o5)官方文档。
废话不多说,接下来直接展示代码:
1. Swift类中导入SDK提供的公共类
/// 智能语音识别
import NlsSdk.NlsClientAdaptor
import NlsSdk.RecognizerRequestParam
import NlsSdk.NlsSpeechRecognizerRequest
2. 创建类
/// 智能语音识别
var nlsClient = NlsClientAdaptor()
var recognizeRequest:NlsSpeechRecognizerRequest?
var voiceRecorder = NlsVoiceRecorder()
var recognizeRequestParam = RecognizerRequestParam()
var recognizerStarted = false
3. 初始化操作,在viewDidLoad()中调用
/// 智能语音识别
func voiceRecognition() {
//1. 全局参数初始化操作
//1.1 初始化识别客户端,将recognizerStarted状态置为false
nlsClient = NlsClientAdaptor()
recognizerStarted = false
//1.2 初始化录音recorder工具
voiceRecorder.delegate = self
//1.3 初始化识别参数类
recognizeRequestParam = RecognizerRequestParam()
//1.4 设置log级别
nlsClient.setLog(nil, logLevel: 1)
}
4. 开始录音
///////////// 智能语音识别 /////////////////////////////////
func startRecognize() {
//2. 创建请求对象和开始识别
//2.1 创建请求对象,设置NlsSpeechRecognizerDelegate回调
recognizeRequest = nlsClient.createRecognizerRequest()
recognizeRequest!.delegate = self
//2.2 设置RecognizerRequestParam请求参数
recognizeRequestParam.format = "opu"
recognizeRequestParam.enableIntermediateResult = true
//请使用https://help.aliyun.com/document_detail/72153.html 动态生成token
// <AccessKeyId> <AccessKeySecret> 请使用您的阿里云账户生成 https://ak-console.aliyun.com/
recognizeRequestParam.token = "使用你自己的token"
recognizeRequestParam.appkey = "使用你自己的appkey"
//2.3 传入请求参数
recognizeRequest!.setRecognizeParams(recognizeRequestParam)
//2.4 启动录音和识别,将recognizerStarted置为true
voiceRecorder.start(true)
recognizeRequest!.start()
recognizerStarted = true
//2.5 更新UI
DispatchQueue.main.async {
print("主线程刷新你的UI操作")
}
}
5. 结束录音
// 结束录音
func stopVoiceAction(_ sender: UIButton) {
print("录音结束了。。。。。")
//3 结束识别 停止录音,停止识别请求
voiceRecorder.stoprecorder(true)
recognizeRequest!.stop()
recognizerStarted = false;
}
6. 实现代理方法
/**
*4. NlsSpeechRecognizerDelegate回调方法
*/
//4.1 识别回调,本次请求失败
func onTaskFailed(_ event: NlsDelegateEvent, statusCode: String!, errorMessage eMsg: String!) {
voiceRecorder.stoprecorder(true)
print("OnTaskFailed, error message is: \(eMsg)")
}
//4.2 识别回调,服务端连接关闭
func onChannelClosed(_ event: NlsDelegateEvent, statusCode: String!, errorMessage eMsg: String!) {
voiceRecorder.stoprecorder(true)
print("OnTaskFailed, error message is: \(statusCode)")
}
//4.3 识别回调,识别结果结束
func onRecognizedCompleted(_ event: NlsDelegateEvent, result: String!, statusCode: String!, errorMessage eMsg: String!) {
recognizerStarted = false
// 主线程UI更新代码
DispatchQueue.main.async {
print("主线程刷新你的UI操作")
}
}
//4.4 识别回调,识别中间结果
func onRecognizedResultChanged(_ event: NlsDelegateEvent, result: String!, statusCode: String!, errorMessage eMsg: String!) {
}
/**
*5. 录音相关回调
*/
func recorderDidStart() {
print("Did start recorder!")
}
func recorderDidStop() {
print("Did stop recorder!")
}
func voiceDidFail(_ error: Error) {
print("Did recorder error!")
}
//5.1 录音数据回调
func voiceRecorded(_ frame: Data) {
if (recognizerStarted) {
//录音线程回调的数据传给识别服务
recognizeRequest!.sendAudio(frame as Data, length: Int32(frame.count))
}
}
///////////////////////////////////////
对接过程可能出现的问题:
1. 由于阿里云提供的Demo中,录音类的封装是用OC写的,
所以直接在Swift项目中import "NlsVoiceRecorder.h" 是无法找到的,
你需要将该头文件导入在桥接文件中,这样Swift类中才能调用。
2.语音识别过程中汉语数字转阿拉伯文字问题,请看另一篇文章("https://blog.csdn.net/macro_sn/article/details/81778072")