1. 程式人生 > >小程式語音與訊飛語音識別踩坑過程

小程式語音與訊飛語音識別踩坑過程

    【由於CSDN的markdown的排版不是很好,所以整理了一下,新的地址:http://blog.csdn.net/c910511/article/details/54839160】


    公司要在微信小程式上面實現語音識別的功能,後端的踩坑功能就落到了我的頭上了。本著好好學習,努力研究的精神,二話不說就接下了這個任務了。
    我在公司的開發環境是在Window上面的,而生產環境是在Ubuntu上面的,所以有的時候開發出來的東西會有一點相容的問題,這個見怪不怪了。在Window環境上面研究的過程中規中矩,沒有碰到上面太多或者太大的坑。下面先說一下實現的大概思路,接著在說一下遇到的坑。
    我們是在微信的小程式上面呼叫微信的錄音介面,把錄音上傳到我們後端進行處理,我們後端接收到微信小程式傳回來的語音檔案,這個語音檔案是SILK格式的,我們收到SILK格式的檔案後,先要將SILK檔案轉換為WAV格式或者PCM(音訊取樣率要是 16k 或者 8k,16 位,單聲道音訊),在檔案轉換成功後,然後呼叫訊飛的語音識別的介面,把語音轉換為文字的格式,然後使用這個文字進行相對應的邏輯操作。
    微信用的SILKv3編碼是Skype向第三方開發人員和硬體製造商提供免版稅認證(RF)的Silk寬頻音訊編碼器,Skype後來將其開源。反正錄音的檔案很小,發回來的都是幾K的,轉換為PCM或者WAV都是100K左右。下面說一下遇到的坑和爬坑過程:
    坑一:libmsc64.so檔案不生效。花費了一天的時間看文件那些,已經在Window上面把整體的流程跑通了,程式的識別率還是挺高的,接下來要做的是把這個程式配置到測試伺服器上面,看能不能給前端的小程式跑通。因為訊飛的服務要用到動態庫的,而在Window上面的動態庫可以直接放到專案的根目錄或者System32 目錄,但是Ubuntu要自己手動指定LD_LIBRARY_PATH的目錄,雖然之前Linux系統用了很久,但是至少一些基礎得操作,LD_LIBRARY_PATH這個之前是沒有搞過。。。,百度了好久,按照百度的教程配置了一下,發現配置成功了,但是程式卻死活說缺包,實在不行,所以我就把libmasc64.so檔案放到/lib/ 和 /lib64/ 目錄,發現也不行,列印了一些動態庫的地址,/lib/ 和 /lib64/ 目錄是有配置了的,可以直接把so檔案放進去的,很無奈,搞了半天,死活不生效,測試服上面有很多東西,是不能重啟的。最後只能在程式碼裡面執行System.load(/xxxx/libmac64.so),這樣把檔案載入進去,這個是沒有辦法的辦法。
    坑二:語音轉換功能public static void RecognizePcmfileByte(String uuid,String filePath)功能要在訊飛的註冊SpeechUtility.createUtility("appid=" + APPID) 成功後才能只能,不然也會報錯,大概的意思是缺動態庫包,所以我把訊飛的註冊功能在在專案執行的ServletContentListener裡面,這樣就可以保在呼叫轉換語音功能前一定註冊成功了。

坑三:微信小程式檔案上傳BUG,因為這個BUG是微信的鍋,但是也影響到了我們功能的實現了,在我們把功能實現差不多了,前端也把小程式的檔案上傳上來了,識別率還是不錯的,在我們接受的範圍內,然後我就用我的手機掃碼嚐鮮一下,卻發現預約檔案上傳失敗,說是上傳的檔案為空。這個問題就很怪了,我們剛剛才在其他的手機上面測試是沒有什麼問題的,在我這裡卻又問題,難道是我的信仰有問題?試了多部手機才發現:在IPhone上面微信的上傳檔案是沒有什麼問題的,但是在Android上面上傳檔案是不行的,IPhone上面最新的微信是6.5多,Android的最新版本是6.3多,所以上傳檔案有問題,百度了一下,很多人都有這個問題【我們上傳檔案是直接用File上傳的,還沒有試過把檔案轉為base64再上傳】
坑四:訊飛識別率低的問題。我們在拿到微信的檔案後,是通過ffmpeg來進行轉碼的,轉碼的功能我是參考了這個開源專案

https://github.com/kn007/silk-v3-decoder進行轉換的,該專案是用到了Ffmpeg和Gcc,他在轉換的腳本里面

!/bin/bash

File: converter.sh

Date: August 19th, 2016

Time: 18:56:52 +0800

Usage: sh converter.sh silk_v3_file/input_folder output_format/output_folder flag(format)

Flag: not define —- not define, convert a file

other value —- format, convert a folder, batch conversion support

Requirement: gcc ffmpeg

Colors

RED=”\e[31;1m”
GREEN=”\e[32;1m”
YELLOW=”\e[33;1m”
WHITE=”\e[37;1m”
RESET=”\e[0m”

Main

cur_dir=$(cd dirname $0; pwd)

if [ ! -r “curdir/silk/decoder];thenechoe{WHITE}[Notice]RESETSilkv3Decoderisnotfound,compileit.cdcur_dir/silk
make && make decoder
[ ! -r “cur_dir/silk/decoder" ]&&echo -e "{RED}[Error]{RESET} Silk v3 Decoder Compile False, Please Check Your System For GCC.”&&exit  
    echo -e “
{WHITE}========= Silk v3 Decoder Compile Finish =========${RESET}”
fi

cd $cur_dir

while [ 3 ]; do  
    pidof /usr/bin/ffmpeg&&echo -e “
{RED}[Error]{RESET} ffmpeg is occupied by another application, please check it.”&&exit  
    [ ! -d “
1" ]&&echo -e "RED[Error]{RESET} Input folder not found, please check it.”&&exit
TOTAL=(ls1|wc -l)
[ ! -d “2" ]&&mkdir "2”&&echo -e “WHITE[Notice]{RESET} Output folder not found, create it.”
[ ! -d “2" ]&&echo -e "{RED}[Error]{RESET} Output folder could not be created, please check it.”&&exit  
    CURRENT=0  
    echo -e “
{WHITE}========= Batch Conversion Start ==========RESETls1 | while read line; do
let CURRENT+=1
curdir/silk/decoder"1/line""2/line.pcm” > /dev/null 2>&1  
        if [ ! -f “
2/line.pcm];thenffmpegyi1/line2/{line%.*}.3” > /dev/null 2>&1 &
ffmpeg_pid=!whilekill0ffmpeg_pid”; do sleep 1; done > /dev/null 2>&1
[ -f “2/{line%.*}.3" ]&&echo -e "[CURRENT/TOTAL]{GREEN}[OK]RESETConvertline to {line%.*}.3 success, YELLOWbutnotasilkv3encodedfile.{RESET}”&&continue
echo -e “[CURRENT/TOTAL]YELLOW[Warning]{RESET} Convert line false, maybe not a silk v3 encoded file.”&&continue  
        fi  
        ffmpeg -y -f s16le -ar 24000 -ac 1 -i “
2/line.pcm2/{line%.*}.3” > /dev/null 2>&1 &
ffmpeg_pid=!whilekill0ffmpeg_pid”; do sleep 1; done > /dev/null 2>&1
rm “2/line.pcm”
[ ! -f “2/{line%.*}.3" ]&&echo -e "[CURRENT/TOTAL]{YELLOW}[Warning]RESETConvertline false, maybe ffmpeg no format handler for 3.”&&continue  
        echo -e “[
CURRENT/TOTAL]{GREEN}[OK]RESETConvertline To {line%.*}.3 Finish.”
done
echo -e “WHITE=========BatchConversionFinish========={RESET}”
exit
done

curdir/silk/decoder"1” “1.pcm” > /dev/null 2>&1  
if [ ! -f “
1.pcm” ]; then
ffmpeg -y -i “1""{1%.*}.2” > /dev/null 2>&1 &  
    ffmpeg_pid=
!
while kill -0 “ffmpeg_pid”; do sleep 1; done > /dev/null 2>&1  
    [ -f “
{1%.*}.2” ]&&echo -e “{GREEN}[OK]RESETConvert1 to {1%.*}.2 success, YEL

相關推薦

程式語音語音識別過程

【由於CSDN的markdown的排版不是很好,所以整理了一下,新的地址:http://blog.csdn.net/c910511/article/details/54839160】 公司要在微信小程式上面實現語音識別的功能,後端的踩坑功能就

Android開發之聲網即時通訊語音識別相結合

聲網是一家提供語音、視訊即時通訊服務的公司,他的服務大多基於WebRTC開源專案並進行一些優化和修改。而訊飛語音識別應該不用多說了,老羅在釋出會上介紹得已經夠詳細了。 那麼下面進入今天的主題,就是讓聲網和訊飛識別同時使用,之前可能有朋友沒遇到過這樣的需求,那先說一下讓兩者同

語音識別SDK整合 語音識別 語音合成 英語識別

最近專案集成了訊飛語音識別功能,由此記錄簡單的整合流程 demo效果(logcat) 資源下載 1、首先用as建一個model (這個不用介紹) 2、登入訊飛開發者平臺,進入控制檯,建立應用生成appid 1、 建立應用

Android集成語音、百度語音、阿裏語音識別

下載 oid androi tail dst -- 阿裏 info 科大 項目實踐:https://blog.csdn.net/Jsagacity/article/details/80094164 demo下載地址:https://fir.im/jy28 d

Unity接入語音識別___Android版

Unity版本4.6+Eclipse 1,首先我們先去訊飛開放平臺註冊一個開發者賬號(註冊地址:http://www.xfyun.cn),註冊完成後進入控制檯建立一個新的應用。​ 2,提交成功後我們需要選擇我們需要開通我們需要的服務,​​​點選開

unity接科大語音識別Windows平臺(補充前面的文章,添加了錄音功能)

其他操作就不在一一贅述了,直說一下新增的負責錄音的那段程式碼 1、首先利用Microphone類開始錄製和結束錄製音訊 2、利用AudioSource類播放錄製的音訊 3、然後用自己寫的方法Float2Byte將錄製的音訊轉成byte資料,供訊飛語音識別方法呼叫 詳細

Winform利用語音WebAPI實現線上語音合成、語音識別

閒來無事做的一個demo。本來想做成網站的形式,發現不知道怎麼在請求頭裡加資訊,於是就做成了Winform版的。 去官網開通sdk 沒註冊的先要註冊,然後建立應用,應用平臺選擇webAPI 回到控制檯,新增新服務--線上語音合成、語音聽寫 新增IP

利用語音識別技術開發離線語音控制系統(Windows平臺)

本專案做出的產品是一個Windows下的增強現實系統,系統很龐大,產品功能已經基本完善,考慮到給使用者帶來更好的體驗,故綜合評估後採用訊飛語音識別方案進行嫁接。 專案介紹: 1)開啟系統時啟動語音識別,檢測到使用者說出關鍵詞(如:上一步,下一步,結束等)時,系統自動進行相應

語音語音識別輔助類

個人網站:極客時代 下面貼出訊飛語音識別的輔助類: package com.Ray.assistwModel; import java.net.ContentHandler; import java.security.PublicKey; import com.Ray

第三方整合 語音識別 文字轉音

private void init() { //合成監聽器 SynthesizerListener mSynListener = new SynthesizerListener() { //會話結束回撥介面,沒有錯誤時,error為null public

語音命令詞識別的SDK配置運用

之前一直想開始寫技術部落格,倒不是說自己有多牛,只是覺得自己弄了點東西出來想和大家分享,而且聽說有利於自己技術水平的提高,就權當是一次記錄吧,這是第一篇。 之前因為一次比賽App要用到語音識別,做一個通過手機輸入語音指令然後根據輸入內容做出響應的功能,當時請教

android 語音識別語音移植

轉載自:http://blog.csdn.net/chenshufei2/article/details/8496905 一、簡介     語音識別現在應用越來越廣泛了 比如語音寫簡訊、語音搜尋商品、語音搜尋關鍵字等等,這遍我們就簡單的談談國內比較流

Android開發之通過藍芽耳機實現語音識別的功能

近階段在開發一款app,實現通過藍芽耳機進行訊飛語音識別,獲取識別結果之後再通過語音合成從藍芽耳機播報出識別結果。上網也查了很多資料,大多是說通過一下兩行程式碼:      mAudioManager.setBluetoothScoOn(true);           

科大語音識別時字串中特殊字元的處理

比如口算遊戲: 訊飛會返回:請回答[n2]78+11=? 此時我們要去掉[n2] 可做如下操作 String results = "[n2]78+11=?"; results = results.replaceAll("\\[" + "n2" + "\\]", "");

科大語音識別使用過程過的

眨眼之間又是好久沒有寫部落格了,佩服那些寫了很多部落格的大神,堅持和耐心值得我學習 這次寫的是一個知名的語音識別sdk,就是科大訊飛的語音識別,其實也沒有多複雜,但是由於我是用swift語言,期間出了很多差錯 ,搞了好久,在這裡就慢慢記錄下來吧。 使用步驟: (有很多步驟

Android 科大語音識別 金額數字

最近要在應用裡面使用語音識別功能,老闆選擇了科大訊飛的技術,小可也就開始看文件啦; 這裡只嵌入了語音識別,其他的語法什麼的沒有研究,有需要的各位看文件唄; 需要的資料 :只識別數字,若不過濾則把LSpeechManager中的onResult方法中的LDataFormat過

使用語音實現語音識別,朗讀文字

一.走近訊飛(iFly) 語音技術實現了人機語音互動,使人與機器之間溝通變得像人與人溝通一樣簡單。語音技術主要包括語音合成和語音識別兩項關鍵技術。讓機器說話,用的是語音合成技術;讓機器聽懂人說話,用的是語音識別技術。此外,語音技術還包括語音編碼、音色轉換、口語評測、語音

java版阿里雲,百度ai,語音識別效果簡單對比及demo

因為公司的業務的需要,對三家的語音識別(簡短語句識別java版)進行了呼叫和對比,把自己的測試成果貼出來供需要的人蔘考使用.並貼出主要程式碼塊 阿里雲的一句話識別: package com.alibaba.idst.nls.demo; import

語音——離線命令詞識別

離線命令詞識別 效果圖 示例原始碼 步驟: 1. 下載SDK 2. 整合方法 3. 正題,開始整合 1. 新增許可權 這裡用到的喚醒功能不是所有的許可權都用到的,具體用到了哪些許可權,可以看上面的

語音聲紋識別技術——自由說(文字密碼,數字密碼也會介紹)

訊飛科技的語音技術,個人認為非常強大,但是技術文件的介紹,還是有些不完全,也沒有線上的技術客服,相信有很多朋友都會遇到大大小小的問題,第三方SDK的整合,或者整合後方法的呼叫等。 廢話不多說,這裡我先介紹下最近我使用的聲紋識別技術——自由說(文字密碼,數字密碼也會介紹到)