眨眼之间又是好久没有写博客了,佩服那些写了很多博客的大神,坚持和耐心值得我学习
这次写的是一个知名的语音识别sdk,就是科大讯飞的语音识别,其实也没有多复杂,但是由于我是用swift语言,期间出了很多差错 ,搞了好久,在这里就慢慢记录下来吧。
使用步骤: (有很多步骤网上都已经有了,我大概写一下主要的步骤,最主要还是把自己遇到的问题说出来,供大家参考)
1、首先是去讯飞官网创建应用,下载SDK,这些都不复杂,百度一大堆
2、下载好之后,把 iflyMSC.framework 拖入到项目中,这地方推荐是把它拷贝到项目文件夹下,然后在工程中add进去。
3、很重要的一个步骤,就是要添加很多相关的库,如果添加不全,就会报很奇葩的错误,而且找不到头绪,本人就是傻傻的在这里出了好多错……
4、添加完文件之后,由于是swift语言,还要创建一个桥接文件,然后把SDK的头文件包含进去:
#import "iflyMSC/IFlySpeechRecognizerDelegate.h"
#import "iflyMSC/IFlySpeechRecognizer.h"
#import "iflyMSC/IFlyRecognizerViewDelegate.h"
#import "iflyMSC/IFlyRecognizerView.h"
#import "iflyMSC/IFlyContact.h"
#import "iflyMSC/IFlyUserWords.h"
#import "iflyMSC/IFlyDataUploader.h"
#import "iflyMSC/IFlySpeechSynthesizerDelegate.h"
#import "iflyMSC/IFlySpeechSynthesizer.h"
#import "iflyMSC/IFlySpeechUtility.h"
#import "iflyMSC/IFlySpeechConstant.h"
#import "iflyMSC/IFlySpeechError.h"
#import "iflyMSC/IFlySpeechUnderstander.h"
#import "iflyMSC/IFlyTextUnderstander.h"
#import "iflyMSC/IFlySetting.h"
5、做完这些之后,就可以在你的项目中放心使用了,它分为两种界面,一种是无语音识别界面,一种是有语音识别界面。两种的使用方法都差不多相同
无界面:
class ViewController: UIViewController,<span style="color:#33cc00;">IFlySpeechRecognizerDelegate</span>,UITextViewDelegate {
var iflySpeechRecognizer:<span style="color:#33cc00;">IFlySpeechRecognizer</span>!
var resultText = ""
var textView = UITextView()
var backView:UIView!
var VoiceTextView:UITextView!
var voiceView:UIView!
override func viewDidLoad() {
super.viewDidLoad()
var initString:String!
initString = "appid=575fb8bb"
IFlySpeechUtility.createUtility(initString)
self.iflySpeechRecognizer = IFlySpeechRecognizer.sharedInstance() as IFlySpeechRecognizer
self.iflySpeechRecognizer.delegate = self
self.iflySpeechRecognizer.setParameter("iat", forKey: IFlySpeechConstant.IFLY_DOMAIN())
self.iflySpeechRecognizer.setParameter("16000", forKey: IFlySpeechConstant.SAMPLE_RATE())
self.iflySpeechRecognizer.setParameter("plain", forKey: IFlySpeechConstant.RESULT_TYPE())
self.iflySpeechRecognizer.setParameter("-1", forKey: IFlySpeechConstant.SPEECH_TIMEOUT())
self.iflySpeechRecognizer.setParameter("8000", forKey: IFlySpeechConstant.VAD_EOS())
self.iflySpeechRecognizer.setParameter("8000", forKey: IFlySpeechConstant.VAD_BOS())
self.iflySpeechRecognizer.setParameter("500000", forKey: IFlySpeechConstant.SPEECH_TIMEOUT())
self.iflySpeechRecognizer.setParameter("50000", forKey: IFlySpeechConstant.NET_TIMEOUT())
textView.frame = CGRectMake(50, 200, 200, 100)
textView.textColor = UIColor.whiteColor()
textView.text = "lllllll"
self.view.addSubview(textView)
let btn:UIButton = UIButton(frame:CGRectMake(100,100,100,100))
btn.backgroundColor = UIColor.redColor()
btn.setTitle("语音识别", forState: UIControlState.Normal)
btn.addTarget(self, action: #selector(startVoiceBtn), forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(btn)
}
<p class="p1"><span class="s1">func</span><span class="s2"> startVoiceBtn() {</span></p><p class="p1"><span class="s2"></span></p><p class="p1"><span class="s1"><span style="white-space:pre"> </span>iflySpeechRecognizer</span><span class="s2">.</span><span class="s3">startListening</span><span class="s2">()</span></p><p class="p1"><span style="font-family: Arial, Helvetica, sans-serif;">}</span></p><p class="p1"><span style="font-family: Arial, Helvetica, sans-serif;"></span></p><p class="p1"><span class="s1"> </span><span class="s2">func</span><span class="s1"> onResults(results: [</span><span class="s3">AnyObject</span><span class="s1">]!, isLast: </span><span class="s3">Bool</span><span class="s1">) {</span></p><p class="p2"><span class="s1"> </span></p><p class="p1"><span class="s1"> </span><span class="s2">var</span><span class="s1"> resultStr : </span><span class="s3">String</span><span class="s1"> = </span><span class="s4">""</span></p><p class="p1"><span class="s1"> </span><span class="s2">if</span><span class="s1"> results != </span><span class="s2">nil</span><span class="s1"> {</span></p><p class="p1"><span class="s1"> </span><span class="s2">let</span><span class="s1"> resultDic : </span><span class="s3">Dictionary</span><span class="s1"><</span><span class="s3">String</span><span class="s1">, </span><span class="s3">String</span><span class="s1">> = results[</span><span class="s5">0</span><span class="s1">] </span><span class="s2">as</span><span class="s1">! </span><span class="s3">Dictionary</span><span class="s1"><</span><span class="s3">String</span><span class="s1">, </span><span class="s3">String</span><span class="s1">></span></p><p class="p2"><span class="s1"> </span></p><p class="p1"><span class="s1"> </span><span class="s2">for</span><span class="s1"> key </span><span class="s2">in</span><span class="s1"> resultDic.</span><span class="s3">keys</span><span class="s1"> {</span></p><p class="p1"><span class="s1"> resultStr += key</span></p><p class="p1"><span class="s1"> }</span></p><p class="p1"><span class="s1"> }</span></p><p class="p2"><span class="s1"> </span></p><p class="p1"><span class="s1"> </span><span class="s2">if</span><span class="s1"> </span><span class="s6">resultText</span><span class="s1"> != </span><span class="s4">""</span><span class="s1"> {</span></p><p class="p1"><span class="s1"> </span><span class="s2">if</span><span class="s1"> (</span><span class="s6">resultText</span><span class="s1"> </span><span class="s2">as</span><span class="s1"> </span><span class="s3">NSString</span><span class="s1">).</span><span class="s7">substringWithRange</span><span class="s1">(</span><span class="s7">NSMakeRange</span><span class="s1">( </span><span class="s6">resultText</span><span class="s1">.</span><span class="s3">characters</span><span class="s1">.</span><span class="s3">count</span><span class="s1"> - </span><span class="s5">1</span><span class="s1">, </span><span class="s5">1</span><span class="s1">)) != </span><span class="s4">","</span><span class="s1"> {</span></p><p class="p1"><span class="s1"> </span><span class="s6">resultText</span><span class="s1"> += </span><span class="s4">","</span></p><p class="p1"><span class="s1"> }</span></p><p class="p1"><span class="s1"> }</span></p><p class="p1"><span class="s1"> </span><span class="s6">resultText</span><span class="s1"> += resultStr</span></p><p class="p3"><span class="s8"> </span><span class="s1">VoiceTextView</span><span class="s8">.</span><span class="s3">text</span><span class="s8"> = </span><span class="s1">resultText</span></p><p class="p1"><span class="s1"> }</span></p><p class="p2"><span class="s1"> </span></p><p class="p1"><span class="s1"> </span><span class="s2">func</span><span class="s1"> onError(errorCode: </span><span class="s6">IFlySpeechError</span><span class="s1">!) {</span></p><p class="p1"><span class="s1"> </span><span class="s7">print</span><span class="s1">(</span><span class="s4">"</span><span class="s9">识别出错:</span><span class="s1">\</span><span class="s4">(</span><span class="s1">errorCode.</span><span class="s6">errorCode</span><span class="s4">)"</span><span class="s1">)</span></p><p class="p1"><span class="s1"> </span><span class="s2">if</span><span class="s1"> errorCode.</span><span class="s6">errorCode</span><span class="s1"> == </span><span class="s5">0</span><span class="s1"> {</span></p><p class="p3"><span class="s8"> </span><span class="s1">iflySpeechRecognizer</span><span class="s8">.</span><span class="s10">startListening</span><span class="s8">()</span></p><p class="p1"><span class="s1"> }</span></p><p class="p1"><span class="s1"> }</span></p>
其实没有多少注意的地方,就是遵循那个代理,然后实现两个代理方法就行了,真机测试之后就会发现,在onReaults中就能打印出识别的文字了,然后根据自己的需求不同来对字符串进行处理,这里特别注意的是联网,真机测试,然后用普通话说出想要识别的文字,如果光发出声响,他就会一直报识别错误的错。
有界面:
import UIKit
class voiceViewController: UIViewController,IFlyRecognizerViewDelegate {
var iflyRecognizerView:IFlyRecognizerView!
var isRecongnizer = false
var resultText = ""
var textView = UITextView()
override func viewDidLoad() {
super.viewDidLoad()
var initString:String!
initString = "appid=575fb8bb"
IFlySpeechUtility.createUtility(initString)
self.iflyRecognizerView = IFlyRecognizerView.init(center: self.view.center)as IFlyRecognizerView
self.iflyRecognizerView.delegate = self
self.iflyRecognizerView.setParameter("iat", forKey: IFlySpeechConstant.IFLY_DOMAIN())
self.iflyRecognizerView.setParameter("16000", forKey: IFlySpeechConstant.SAMPLE_RATE())
// | result_type | 返回结果的数据格式 plain,只支持plain
self.iflyRecognizerView.setParameter("plain", forKey: IFlySpeechConstant.RESULT_TYPE())
textView.frame = CGRectMake(50, 200, 200, 100)
textView.backgroundColor = UIColor.grayColor()
textView.textColor = UIColor.whiteColor()
textView.text = "lllllll"
self.view.addSubview(textView)
let btn:UIButton = UIButton(frame:CGRectMake(100,100,100,100))
btn.backgroundColor = UIColor.redColor()
btn.setTitle("语音识别", forState: UIControlState.Normal)
btn.addTarget(self, action: #selector(startVoiceBtn), forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(btn)
}
func startVoiceBtn() {
print("开始识别")
iflyRecognizerView.start()
}
func onResult(results: [AnyObject]!,isLast: Bool) {
var resultStr : String = ""
if results != nil {
let resultDic : Dictionary<String, String> = results[0] as! Dictionary<String, String>
for key in resultDic.keys {
resultStr += key
}
}
if resultText != "" {
if (resultText as NSString).substringWithRange(NSMakeRange( resultText.characters.count - 1, 1)) != "," {
resultText += ","
}
}
resultText += resultStr
textView.text = resultText
if isRecongnizer {
iflyRecognizerView.start()
} else {
iflyRecognizerView.cancel()
if resultText != "" {
resultText = (resultText as NSString).substringWithRange(NSMakeRange( 0, resultText.characters.count - 1)) + "。"
textView.text = resultText
}
}
}
func onError(error: IFlySpeechError!) {
print("识别出错:\(error.errorCode)")
}
6、两种方法就是遵循的代理不同,然后用到的类不同,其实也没有多复杂的地方,只是刚开始的时候有点蒙,用起来就好了