• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            Speex manul中文版

            轉(zhuǎn)載自:http://www.cnblogs.com/rosesmall/archive/2012/04/18/2455395.html

            在VOIP的音頻算法中,回音處理已經(jīng)成為一個(gè)關(guān)系通話質(zhì)量的主要問題。

            回聲的產(chǎn)生在IP網(wǎng)絡(luò)主要有兩種:
            1.聲學(xué)回聲
            2.電路回聲

            聲學(xué)回聲主要又分成以下幾種:
            a ) 直接回聲:由揚(yáng)聲器產(chǎn)生的聲音未經(jīng)任何反射直接進(jìn)入麥克風(fēng)
            b ) 間接回聲: 由揚(yáng)聲器發(fā)出的聲音經(jīng)過多次反射后,再進(jìn)入Mic
            對(duì)于第二種回聲,擁有多路徑,時(shí)變性的特點(diǎn).是比較難處理的.

            由于IP網(wǎng)絡(luò)下的傳輸?shù)难舆t較大,而一般情況下,對(duì)于人耳,如果聲音延遲達(dá)到了10ms以上的話,那么回聲就會(huì)越來越明顯.
            一般來講,VOIP中的聲音延遲主要來自于幾個(gè)方面:
            1. 編碼延遲: 一般情況下編碼算法在聲音壓縮時(shí)都會(huì)產(chǎn)生延遲,就我們采用的Speex來講,延遲大概在20ms左右
            2. 處理延遲, 封裝時(shí)延, 緩沖時(shí)延等
            3. 在IP網(wǎng)絡(luò)中數(shù)據(jù)的傳輸過程也會(huì)照成延時(shí).這由當(dāng)前的網(wǎng)絡(luò)狀況決定.

            回聲消除的模型:
            a) 建立遠(yuǎn)端聲音模型,進(jìn)行回聲估計(jì), 從采集的值中減去估計(jì)值
            b) 聲學(xué)模型

            Speex manul(手冊(cè))中文版

            Speex是一套專門用于壓縮聲音的庫,由于其專門針對(duì)聲音,所以壓縮聲音的性能非常高.Speex由于其壓縮性能,0.80版后的跨平臺(tái)的性能,所以在網(wǎng)絡(luò)聲音的傳輸中有很大的價(jià)值.但是需要注意的是speex只能對(duì)聲音進(jìn)行壓縮,不支持音樂的壓縮,如果你需要音樂的壓縮你或許需要用vorbis.

                   但是的speex資料像其它大都數(shù)專用庫一樣,并沒有大多的中文資料.所以在這里我決定將里面最核心的編程技術(shù)翻譯出來.一來是練習(xí)練習(xí)自己翻譯資料的能力,二來是方便一些英語水平較差的朋友.由于本人能力有限,有些感覺有出入或難理解的地方可以去speex的官方網(wǎng)站www.speex.org找到英文原版的說明.

            翻譯的一些說明:

            1,對(duì)于一些專有名詞如speex,api不過行翻譯

            2,對(duì)于一些新概念翻譯,以及其它的翻譯過來也許會(huì)產(chǎn)生歧義的文字,用中/英兩種方式標(biāo)出:

                   :對(duì)話(speech),位采集(bit_packing)

            3,基本做到和英文原行對(duì)譯.及英文原文一行,中文翻譯過來也是一行,使翻譯后的文章和原文基本行行對(duì)照.

            4,源代碼不翻譯,SpeexBits bits;

            5,語言中的關(guān)健字不譯,float

            6,一此不是關(guān)健字但英文通常出現(xiàn)的詞第一次以中/英文格式給出,之后按具體情況給出英文或中文,:frame(),

            7,對(duì)一些有自己翻譯起來感覺有歧義的地方,加斜線作標(biāo)記 

            1,speex的介紹(略)

            2特征描述

            這個(gè)章節(jié)展示了speex的主要特征,以衣一些關(guān)于對(duì)話(speech)編碼的一個(gè)概念,以便

            幫助我們更好的了解下一章節(jié).

            取樣率(Sampling rate)

            Speex主要是設(shè)計(jì)了三種不同的取樣率:8kHz,16kHz,32kHz.這些分別代表了窄寬(narrowband),

            多頻率,超聲.

            質(zhì)量

            Speex編碼大都數(shù)時(shí)間是被一個(gè)范圍為010的質(zhì)量參數(shù)來控制  .在一個(gè)比特率為常量(CBR)的操作中,質(zhì)量參數(shù)是一個(gè)整數(shù),而對(duì)于變動(dòng)的比特率(VBR)參數(shù)是一個(gè)float;

            復(fù)雜性(變量)

            speex,你可以將編碼設(shè)置成允許的復(fù)雜度.這由一個(gè)范圍為110的整數(shù)來控制完成,就像你用選項(xiàng)-1-9來控制gzipbzip2的壓縮質(zhì)量.在通常的運(yùn)用中,噪聲級(jí)別的復(fù)雜度1是在12dB之間,比復(fù)雜度10要高,但是CPU需要復(fù)雜度10大概5倍高行復(fù)雜度1.在實(shí)踐中,最好的是設(shè)置在24之間,盡管更高的設(shè)定通常有用,當(dāng)編碼一個(gè)非對(duì)話聲音(non-speech sounds)DTMF語調(diào)(tones).

            變波特率(VBR

            Variable bit-rate (VBR) allows a codec to change its bit-rate dynamically to adapt to

            變波特率(VBR)允許編碼動(dòng)態(tài)地改變它的波特率以適應(yīng)聲音編碼的難度”.speex舉例來說,

            像元音(vowel)和瞬間高音(high-enenrg transients)需要個(gè)高的比特率來

            取得一個(gè)不錯(cuò)的質(zhì)量,

            而摩擦音(fricative)可以被充分地用相對(duì)較少的字節(jié)來進(jìn)行編碼.

            由于上面這個(gè)原因,VBR可以調(diào)節(jié)到一個(gè)低的比特率卻達(dá)到一個(gè)同樣的質(zhì)量,或者用

            某個(gè)比特率達(dá)到更好的質(zhì)量.盡管有上面這些優(yōu)點(diǎn),但是VBR也有兩個(gè)主要的缺點(diǎn).

            首先,僅僅靠指定質(zhì)量值,這里沒有一個(gè)關(guān)于最后平均比特率的保證.(譯者注:作者大概是想說沒有什么明確的方法知道質(zhì)量值)此外,對(duì)一些即時(shí)

            通信,IP電話(VoIP)這種包含著最大的比特率的,必須把比特率設(shè)為足夠低以適應(yīng)

            傳輸通道.

            r

            平均比特率(ABR)

            平均比特率通過動(dòng)態(tài)地調(diào)節(jié)VBR質(zhì)量去得到一個(gè)確定的目標(biāo)的比特率,從而解決了VBR中的一個(gè)問題..因?yàn)橘|(zhì)量/比特率被即時(shí)的調(diào)整了,整體質(zhì)量將會(huì)稍稍低于由VBR對(duì)一個(gè)

            設(shè)置得和目標(biāo)平均比特率非常接近的質(zhì)量數(shù)編碼得到的結(jié)果.

             

            聲音生動(dòng)性檢測(cè)(VAD)

            聲音生動(dòng)性檢測(cè)將會(huì)發(fā)覺音頻正在被編碼成對(duì)話,靜音,或背景噪音.VAD總在用VBR進(jìn)行編碼時(shí)暗中起作用,因此選項(xiàng)僅僅對(duì)一個(gè)不是VBR的操作起作用.對(duì)于不是VBR的操作來說,speex察覺出一個(gè)不屬于對(duì)話的周期,然后對(duì)它用足夠的字節(jié)重新生成為背景噪音.不這叫做舒適的噪音生成(CNG).

            不連續(xù)傳輸(DTX)

            不連續(xù)傳輸是VAD/VBR操作的一個(gè)額外選項(xiàng),當(dāng)背景噪音一定時(shí),它可以完整地傳輸.因?yàn)樵诨谖募牟僮髦?/span>,我們不能停止對(duì)文件進(jìn)行寫入,所以只有5字節(jié)被這種幀所運(yùn)用.(250bps通信)

            Perceptual enhancement

            知覺增強(qiáng)

            知覺增加是解碼的一部分,它在打開的時(shí)候用來減少由編碼解碼所產(chǎn)生的噪音.在大都數(shù)

            情況下,知覺增強(qiáng)在客觀上使聲音離原始值更遠(yuǎn)(如果用SNR),但是在最后它仍然聽起來更好(主觀上的改進(jìn))

            Algorithmic delay

            遲時(shí)算法

            每一個(gè)聲音編碼導(dǎo)致了在傳輸上的延時(shí).對(duì)于speex,這種延時(shí)等于frame的大小加上一些

            數(shù)量的需要對(duì)每一幀進(jìn)行的前瞻(”look-adhead”).

            在窄寬操作中(8kHz),遲時(shí)是30ms,而對(duì)于多頻率(2-44Hz),遲時(shí)是34ms.這些值

            不包括CPU編碼,解碼幀的時(shí)間. 

            speex編程(the libspeex api)

            這個(gè)章節(jié)出要講述了如何用speex api進(jìn)行編程.例子的源代友你也可以在附錄B中找到

            4.1 Encoding

            4.1壓縮

            為了用Speex壓縮對(duì)話,你首先需要引用頭文件:

            #include <speex.h>

            然后你需要定義一個(gè)Speex的位采集(bit-packing)結(jié)構(gòu)

            SpeexBits bits;

            and a Speex encoder state

            以及定義一個(gè)speex編碼器狀態(tài)量

            void *enc_state;

            上面定義的這樣被初始化:

            The two are initialized by:

            speex_bits_init(&bits);

            enc_state = speex_encoder_init(&speex_nb_mode);

            為了支持多頻率的壓縮,speex_nb_mode將被sppex_wb_mode取代.在大都數(shù)

            情況下,你需要知道你用的模式(mode)的幀(frame)的大小,你可以得到在frame_size變量里得到這值:

            speex_encoder_ctl(enc_state,SPEEX_GET_FRAME_SIZE,&frame_size);

            一但初始化完畢,對(duì)于每一個(gè)輸入幀:

            speex_bits_reset(&bits);

            speex_encode(enc_state, input_frame, &bits);

            nbBytes = speex_bits_write(&bits, byte_ptr, MAX_NB_BYTES);

            上面input_frame是一個(gè)指向?qū)υ?/span>(speech)(frame)float指針(pointing);byte_ptr

            是指向編碼幀開始寫的地方的char指針,MAX_NB_BYTES是能

            寫進(jìn)byte_ptr而不會(huì)造成溢出的最大數(shù).nbBytes是一個(gè)實(shí)際寫入btye_ptr的數(shù),即編碼的實(shí)際大小

            在調(diào)用speex_bits_write,可能你需要調(diào)用speex_bits_nbytes(&bits)得到需要寫入(write)的字節(jié)大小.

            在你已經(jīng)編碼后,釋放所有的資源.

            speex_bits_destroy(&bits);

            speex_encoder_destroy(enc_state);

            That’s about it for the encoder.

             

            這就是關(guān)于編碼的方面.

             

            Speex manul中文版三

            附源代碼的翻譯:

            B Sample code

            例程源代碼

            這個(gè)章節(jié)演示了一段用speex編碼,解碼對(duì)話(speech)的源代碼.

            可以如下用api命令來編碼并解碼一個(gè)文件:

            譯者注:這里說的api命令是指unix的用”|”進(jìn)行管道寫入讀出.windows下這樣并不能實(shí)現(xiàn).

            % sampleenc in_file.sw | sampledec out_file.sw

            這里這兩段代碼都沒有引用其它的頭文件,并以16 比特率(bits)進(jìn)行編碼

            natural endianness).

            B.1 sampleenc.c

            Sameleenc 用一個(gè)未加工的16比特率(bits)文章,給它編碼并產(chǎn)生一個(gè)speex (steam)給標(biāo)準(zhǔn)輸出.注意已壓縮的和speexenc/speexdec不和諧!

            #include <speex.h>

            #include <stdio.h>

            /*幀的大小在這個(gè)例程中是一個(gè)固定的值,但它并不是必須這樣*/

             

            #define FRAME_SIZE 160

            int main(int argc, char **argv)

            {

            char *inFile;

            FILE *fin;

            short in[FRAME_SIZE];

            float input[FRAME_SIZE];

            char cbits[200];

            int nbBytes;

            /*保存編碼的狀態(tài)*/

            void *state;

            /*保存字節(jié)因此他們可以被speex常規(guī)讀寫*/

             

            SpeexBits bits;

            int i, tmp;

            //新建一個(gè)新的編碼狀態(tài)在窄寬(narrowband)模式下

            state = speex_encoder_init(&speex_nb_mode);

            //設(shè)置質(zhì)量為8(15kbps)

            tmp=8;

            speex_encoder_ctl(state, SPEEX_SET_QUALITY, &tmp);

            inFile = argv[1];

            fin = fopen(inFile, "r");

            //初始化結(jié)構(gòu)使他們保存數(shù)據(jù)

            speex_bits_init(&bits);

            while (1)

            {

            //讀入一幀16bits的聲音

            fread(in, sizeof(short), FRAME_SIZE, fin);

            if (feof(fin))

            break;

            //16bits的值轉(zhuǎn)化為float,以便speex庫可以在上面工作

            for (i=0;i<FRAME_SIZE;i++)

            input[i]=in[i];

            //清空這個(gè)結(jié)構(gòu)體里所有的字節(jié),以便我們可以編碼一個(gè)新的幀

            speex_bits_reset(&bits);

            //對(duì)幀進(jìn)行編碼

            speex_encode(state, input, &bits);

            //bits拷貝到一個(gè)利用寫出的char型數(shù)組

            nbBytes = speex_bits_write(&bits, cbits, 200);

            //首先寫出幀的大小,這是sampledec文件需要的一個(gè)值,但是你的應(yīng)用程序中可能不一樣

            fwrite(&nbBytes, sizeof(int), 1, stdout);

            //寫出壓縮后的數(shù)組

            fwrite(cbits, 1, nbBytes, stdout);

            }

            //釋放編碼器狀態(tài)量

            speex_encoder_destroy(state);

            //釋放bit_packing結(jié)構(gòu)

            speex_bits_destroy(&bits);

            fclose(fin);

            return 0;

            }

             

             

            在Speex(www.speex.org)的最新版本中,開始集成了回音消除的模塊,而回音消除一直是Voip之中亟待解決的主要問題。
            很多朋友和我說speex的aec模塊的效能并不好,我們先來看一下speex的aec的api調(diào)用方式。

            /*
            *創(chuàng)建AEC對(duì)象
            */
            SpeexEchoState *echo_state = speex_echo_state_init(frame_size, filter_length);

            frame_size 的取值最好是一個(gè)編碼的frame大小, 在低帶寬條件下,一般延遲20ms,而大小為160
            filter_length,最好是房間內(nèi)反射時(shí)間的1/3
            如: 一個(gè)房間的反射時(shí)延為300ms
                那么這個(gè)filter_length就最好是100ms(這個(gè)長(zhǎng)度又被稱為tail length).

            而其中filter_length的設(shè)定是一個(gè)關(guān)鍵。

            /*
            *執(zhí)行AEC
            */
            speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue);

            其中:
            input_frame: 就是被聲卡捕捉到的聲音
            echo_frame: 是由揚(yáng)聲器播放出的聲音,這個(gè)聲音是需要從 input_frame中抵消的聲音.

            output_frame 是處理完以后輸出的聲音

            residue是一個(gè)可選參數(shù),如果不使用可以將之設(shè)置為NULL, 也可以通過preprocessor 來控制

            問題的關(guān)鍵是 處理input和echo 之間的關(guān)系,
            也就是說在捕捉到的信號(hào)和播放的信號(hào)之間的延遲必須足夠的小,才可以提高效率.

            writetosndcard(echo_frame, frame_size)
            readfromsndcard(input_frame, frame_size)
            speex_echo_cancel(echo_state, input_frame, echo_frame, output_frame, residue)
            如果你想要盡可能的減小信號(hào)中的回音,那么可以將residue這個(gè)參數(shù)設(shè)置為噪音參數(shù).

            我相信在大多數(shù)情況下,都是因?yàn)槁曇舨蹲胶吐曇舨シ胖g的同步問題沒有處理好,導(dǎo)致的音頻質(zhì)量下降。

            /*
            *銷毀和復(fù)位
            */
            speex_echo_state_destroy(echo_state);

            speex_echo_state_reset(echo_state);
            不再復(fù)述了!

            說明:
            據(jù)說在Speex的最新的1.2beta版本上,Speex提供了可選擇的,簡(jiǎn)化的API,來提高echo執(zhí)行過程中的同步問題。

            posted on 2012-11-21 23:56 楊粼波 閱讀(3932) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 文章收藏C++Windows

            評(píng)論

            # re: Speex manul中文版 2015-05-15 19:12 王小亮

            恩。學(xué)習(xí)了。謝謝;。  回復(fù)  更多評(píng)論   

            热99re久久国超精品首页| 88久久精品无码一区二区毛片| 免费精品久久久久久中文字幕 | 麻豆一区二区99久久久久| 亚洲国产另类久久久精品| 91精品久久久久久无码| 国产香蕉久久精品综合网| 国产精品久久久久久| 无码8090精品久久一区| 99久久国语露脸精品国产| 成人精品一区二区久久| 久久精品天天中文字幕人妻| 久久久WWW成人| 97久久香蕉国产线看观看| 麻豆av久久av盛宴av| 久久国产精品一区| 国产精品毛片久久久久久久| 伊人久久大香线蕉成人| 久久99精品久久久久久水蜜桃| 久久久噜噜噜久久熟女AA片| 欧美与黑人午夜性猛交久久久| 精品久久久久久久久中文字幕| 亚洲综合久久夜AV | 久久久久综合国产欧美一区二区| 99久久精品日本一区二区免费| 亚洲AV日韩精品久久久久久| 国内精品伊人久久久久妇| 久久精品成人| 久久精品无码一区二区app| 99久久精品免费看国产| 国产精品久久自在自线观看| 国产精品99精品久久免费| 精品久久久无码21p发布| 日韩人妻无码一区二区三区久久99 | 久久亚洲日韩看片无码| 亚洲欧美日韩久久精品| 国内精品久久久久影院亚洲| 97精品伊人久久大香线蕉| 亚洲综合久久夜AV | 精品久久久久成人码免费动漫| 狠狠色婷婷久久综合频道日韩|