1. 程式人生 > >科大訊飛語音識別使用過程中踩過的坑

科大訊飛語音識別使用過程中踩過的坑

眨眼之間又是好久沒有寫部落格了,佩服那些寫了很多部落格的大神,堅持和耐心值得我學習

這次寫的是一個知名的語音識別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、 建立應用