科大訊飛語音識別使用過程中踩過的坑
眨眼之間又是好久沒有寫部落格了,佩服那些寫了很多部落格的大神,堅持和耐心值得我學習
這次寫的是一個知名的語音識別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、兩種方法就是遵循的代理不同,然後用到的類不同,其實也沒有多複雜的地方,只是剛開始的時候有點蒙,用起來就好了
相關推薦
科大訊飛語音識別使用過程中踩過的坑
眨眼之間又是好久沒有寫部落格了,佩服那些寫了很多部落格的大神,堅持和耐心值得我學習 這次寫的是一個知名的語音識別sdk,就是科大訊飛的語音識別,其實也沒有多複雜,但是由於我是用swift語言,期間出了很多差錯 ,搞了好久,在這裡就慢慢記錄下來吧。 使用步驟: (有很多步驟
科大訊飛語音識別時字串中特殊字元的處理
比如口算遊戲: 訊飛會返回:請回答[n2]78+11=? 此時我們要去掉[n2] 可做如下操作 String results = "[n2]78+11=?"; results = results.replaceAll("\\[" + "n2" + "\\]", "");
unity接科大訊飛語音識別Windows平臺(補充前面的文章,添加了錄音功能)
其他操作就不在一一贅述了,直說一下新增的負責錄音的那段程式碼 1、首先利用Microphone類開始錄製和結束錄製音訊 2、利用AudioSource類播放錄製的音訊 3、然後用自己寫的方法Float2Byte將錄製的音訊轉成byte資料,供訊飛語音識別方法呼叫 詳細
Android 科大訊飛語音識別 金額數字
最近要在應用裡面使用語音識別功能,老闆選擇了科大訊飛的技術,小可也就開始看文件啦; 這裡只嵌入了語音識別,其他的語法什麼的沒有研究,有需要的各位看文件唄; 需要的資料 :只識別數字,若不過濾則把LSpeechManager中的onResult方法中的LDataFormat過
Android 科大訊飛語音識別 金額數字
最近要在應用裡面使用語音識別功能,老闆選擇了科大訊飛的技術,小可也就開始看文件啦; 這裡只嵌入了語音識別,其他的語法什麼的沒有研究,有需要的各位看文件唄; 需要的資料 :只識別數字,若不過濾則把LSpeechManager中的onResult方法中的LDataFormat過濾去掉即可 1,首先要在科
小程式語音與訊飛語音識別踩坑過程
【由於CSDN的markdown的排版不是很好,所以整理了一下,新的地址:http://blog.csdn.net/c910511/article/details/54839160】 公司要在微信小程式上面實現語音識別的功能,後端的踩坑功能就
ubuntu下,在QT中利用科大訊飛語音庫實現語音合成TTS
首先要去科大訊飛語音庫註冊,下載linux下的線上合成TTS的SDK,然後在QT下建立一個基於控制檯的工程,其實建立關於UI的也可以,問題不大,這裡以控制檯工程進行說明。將sample中TTS部分的t
android專案接入科大訊飛語音評測功能過程
前言 最近專案需要接入語音評測功能,公司有做過這方面的同事推薦了科大訊飛語音評測,於是根據官網的開發指南接入了sdk,可以成功評測使用者的口語能力,並給出合適的分數,但是期間遇到了很多小問題,於是寫在這篇文章記錄一下開發及填坑的過程。 正文 1.接入sdk: 如何接入
科大訊飛語音無限制錄音、識別功能的實現:Android studio(一)
最近想要做一款語音聽寫APP,在網上搜索關於如何使用科大訊飛語音的Demo少之又少,又或者是隻是單純的按照文件來實現簡單的語音聽寫,遠遠不能滿足需求,看了幾天的文件和自己搜尋的一些資料,還有這幾天中遇到的一些問題,覺得有必要做一個筆記,能給初學者一些
Unity接入訊飛語音識別___Android版
Unity版本4.6+Eclipse 1,首先我們先去訊飛開放平臺註冊一個開發者賬號(註冊地址:http://www.xfyun.cn),註冊完成後進入控制檯建立一個新的應用。 2,提交成功後我們需要選擇我們需要開通我們需要的服務,點選開
科大訊飛語音雲使用經歷
科大訊飛的語音識別是屬於一流的行列,那不多想當然選擇科大訊飛了。 在百度上輸:訊飛語音 就能找到,輸科大訊飛會直接出現官網,那裡面沒有。(ps我第一次就是這樣) 下載後會有三個檔案選擇。 一個是語音+ 帶有語音+APP的。一個是含語音互動介面,一個是不含語音互
ionic載入cordova科大訊飛語音輸入法外掛相關問題
1:申請相關appid,見官網,新增語音聽寫服務,下載sdk 2:下載cordova外掛,見https://github.com/Edc-zhang/cordova-plugin-IFlyspeech 3:將sdk的libs資料夾,替換cordova外掛的src/android/libs 將cordo
利用訊飛語音識別技術開發離線語音控制系統(Windows平臺)
本專案做出的產品是一個Windows下的增強現實系統,系統很龐大,產品功能已經基本完善,考慮到給使用者帶來更好的體驗,故綜合評估後採用訊飛語音識別方案進行嫁接。 專案介紹: 1)開啟系統時啟動語音識別,檢測到使用者說出關鍵詞(如:上一步,下一步,結束等)時,系統自動進行相應
科大訊飛語音合成,pcm轉wav
import android.media.AudioFormat; import android.media.AudioRecord; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fi
第三方整合訊飛 語音識別 文字轉音
private void init() { //合成監聽器 SynthesizerListener mSynListener = new SynthesizerListener() { //會話結束回撥介面,沒有錯誤時,error為null public
科大訊飛語音轉文字JSON資料的
報名參加了一個創青春大學生創業大賽,需要把人機互動完善一下,就做了一個簡單的語音互動介面。程式的大體思路是語音方面(包括文字轉語音,語音轉文字)呼叫科大訊飛的 SDK完成,智慧方面(包括智慧文字回覆) ,程式不難,但是在json資料的解析方面花的時間有點長。 j
Android科大訊飛語音按佇列播報
在Android開發中,語音播報經常使用,但是,在使用過程中會發現,如果語音來源過於塊,頻率過高,在前一條沒有播放完的情況下會執行第二條播放,本篇文章用來解決這個問題。 一、科大訊飛語音整合: 1、在科大訊飛的開發者平臺(科大訊飛開放平臺)註冊。我這裡使用的
科大訊飛 語音評測 + 保存錄音 解決wav 錄音無法播放問題
// 設定評測語種 //en_us 英文,zh_cn 漢語 mSpeechEvaluator.setParameter(SpeechConstant.LANGUAGE, "en_us"); // 設定評測題型評測題型,可選值:
科大訊飛 語音sdk 在linux 部署報20021的問題
最近有個專案,使用了科大訊飛 的 文字轉語音sdk, 在linux上部署的時候出現了些問題,主要原因就是找不到 一個叫libmsc64.so的檔案,其實,對於這個問題,網上有很多資料,無非就是設定環境變數,告訴系統去哪裡查詢這個共享庫資源。這裡是官方資料地址:http://b
訊飛語音識別SDK整合 語音識別 語音合成 訊飛英語識別
最近專案集成了訊飛語音識別功能,由此記錄簡單的整合流程 demo效果(logcat) 資源下載 1、首先用as建一個model (這個不用介紹) 2、登入訊飛開發者平臺,進入控制檯,建立應用生成appid 1、 建立應用
