語音識別的客戶端側實現-音頻轉碼

絕大多數的ios錄音實現方案中都是首先錄制成pcm源碼,然后在對文件進行轉碼和壓縮,然后再上傳到服務端上。Pcm文件只要加一個14字節的頭,就是wav文件。常用的壓縮格式有很多。例如:mp3,amr,speex,speex+ogg等等。但是具體壓縮成什么格式要考慮幾個方面:1.壓縮比,2.壓縮算法實現的難度,3.轉碼壓縮需要的時間,4.平臺的通用性(ios和android)等等。綜合了以上一點,我們選擇了壓縮成amr文件然后上傳(在實際的工程中我們也曾經使用過speex+ogg的格式,他的壓縮比很大,但是很多語音識別的服務商不提供對他的支持,后來也就不用了)。

Amr的一個優勢就是android原生就支持,但是amr的轉碼相關的功能直到Android4.X才有相關的API支持。Amr壓縮后的大小不到pcm的1/10,轉碼后的清晰程度也基本能符合要求。(但是amr有wb和nb兩種形式,nb壓縮比例太大,不適合來做語音識別的素材,必須是wb才行。)微信的錄音用的也是amr格式,只是對文件頭等信息自己稍微做了一些修改而已。

確定是用amr,現在的問題就是如何將pcm轉換為amr-wb。Android系統開放的源代碼中直接就有相關的c代碼。現在有開源的工程來實現這個轉換,opencore-amr和opencore-amrwb。opencore-amr主要實現了pcm和arm-nb的相互轉換,和arm-wb的解碼過程。opencore-amrwb提供了一個將pcm文件轉化為arm-nb的接口。所以如果只需要錄音和轉碼為arm-wb格式的話,我們只需要opencore-amrwb即可(下載地址https://sourceforge.net/projects/opencore-amr/files/?source=navbar)。

編譯的過程參考了很多網上的例子,但是在xcode8下編譯成.ad的庫一直沒有成功,所以進行了一些修改,成功的編譯成功并在工程中使用,具體如下:

#!/bin/sh

set -xe

VERSION="0.1.3"

LIBSRCNAME="vo-amrwbenc"

CURRENTPATH=`pwd`

#解壓源代碼

mkdir -p"${CURRENTPATH}/src"

tar zxvf${LIBSRCNAME}-${VERSION}.tar.gz -C "${CURRENTPATH}/src"

cd"${CURRENTPATH}/src/${LIBSRCNAME}-${VERSION}"

#設置環境變量并創建lib-ios文件夾,后續生成的.a類庫都會放在這個文件夾里邊

DEST="${CURRENTPATH}/lib-ios"

mkdir -p"${DEST}"

#編譯的類型

ARCHS="armv7armv7s arm64 i386 x86_64"

#生成的類庫名稱

LIBS="libvo-amrwbenc.a"

#開始編譯類庫

for arch in$ARCHS; do

case $arch inarm*)

IOSV="-miphoneos-version-min=7.0"

if [ $arch =="arm64" ]

then

IOSV="-miphoneos-version-min=7.0"

fi

echo"Building for iOS $arch ****************"

#編譯$arch環境的類庫(amr類型類型)

SDKROOT="$(xcrun--sdk iphoneos --show-sdk-path)"

CC="$(xcrun--sdk iphoneos -f clang)"

CXX="$(xcrun--sdk iphoneos -f clang++)"

CPP="$(xcrun-sdk iphonesimulator -f clang++)"

CFLAGS="-isysroot$SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"

CXXFLAGS=$CFLAGS

CPPFLAGS=$CFLAGS

export CC CXXCFLAGS CXXFLAGS CPPFLAGS

./configure \

--host=arm-apple-darwin\

--prefix=$DEST \

--disable-shared--enable-static

;;

*)

IOSV="-mios-simulator-version-min=7.0"

echo"Building for iOS $arch*****************"

if [ $arch =="i386" ]

then

HOST="i386-apple-darwin"

fi

if [ $arch =="arm64" ]

then

HOST="x86_64-apple-darwin"

fi

#編譯$arch環境的類庫(其他類型類型)

SDKROOT=`xcodebuild-version -sdk iphonesimulator Path`

CC="$(xcrun-sdk iphoneos -f clang)"

CXX="$(xcrun-sdk iphonesimulator -f clang++)"

CPP="$(xcrun-sdk iphonesimulator -f clang++)"

CFLAGS="-isysroot$SDKROOT -arch $arch $IOSV -isystem $SDKROOT/usr/include -fembed-bitcode"

CXXFLAGS=$CFLAGS

CPPFLAGS=$CFLAGS

export CC CXXCFLAGS CXXFLAGS CPPFLAGS

./configure \

--prefix=$DEST \

--host=$HOST \

--disable-shared

;;

esac

make >/dev/null

makeinstall#將編譯成功的可執行文件安裝到指定目錄中

make clean#清除上次的make命令所產生的object文件(后綴為“.o”的文件)及可執行文件。

#清除多余的文件

for i in $LIBS;do

mv $DEST/lib/$i$DEST/lib/$i.$arch

done

done

#制作通用靜態庫

#http://blog.csdn.net/cuiweijie3/article/details/8671240

for i in $LIBS;do

input=""

for arch in$ARCHS; do

input="$input$DEST/lib/$i.$arch"

done

lipo -create-output $DEST/lib/$i $input

done

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容