C# Winform是我們大一時(shí)學(xué)的一基礎(chǔ)課程,現(xiàn)在在大二我們都讓我們做一個(gè)簡(jiǎn)單的呼叫系統(tǒng),不時(shí)我做的時(shí)候沒(méi)有太在意,就按教師說(shuō)的支做了,但做來(lái)做去沒(méi)有硬件,只做一個(gè)樣子(只有其表沒(méi)有其主要內(nèi)容),太沒(méi)意思了,于是在網(wǎng)上找了一些關(guān)二網(wǎng)絡(luò)語(yǔ)音通信的資料用三天的時(shí)候?qū)懥艘粋€(gè)容易的的語(yǔ)音通系統(tǒng),當(dāng)寫完個(gè)小有點(diǎn)小功能的軟件后,我想到了現(xiàn)實(shí)中,將來(lái)的呼叫中心,將完用用電腦軟件的語(yǔ)音識(shí)別來(lái)完成,當(dāng)用記打進(jìn)電話來(lái)的時(shí)候會(huì)根據(jù)用戶所按的鍵進(jìn)行自的分析,選的是什么項(xiàng)目,然后進(jìn)行客戶與計(jì)算機(jī)程序的交流,這樣從一方面為一些大型企業(yè)節(jié)省了不少的開銷,比較原來(lái)用20個(gè)人來(lái)完成的工作現(xiàn)在只要有一臺(tái)電腦完全可以O(shè)K了,并且在程序中可以設(shè)置管理員進(jìn)行監(jiān)聽,同樣具有現(xiàn)在所擁有的功能。想到這里我想起了我剛學(xué)asp.net時(shí)寫的一個(gè)在線英語(yǔ)考試系統(tǒng),里面有薦為在線學(xué)習(xí)(其功能為用記可以在線試聽管理員所錄入的所有信息內(nèi)容,),如果用戶的瀏覽器不支持用戶還可以下載其音頻來(lái)在自己的計(jì)算機(jī)上來(lái)試,當(dāng)初開發(fā)這個(gè)功能的原因,是因?yàn)?,我們學(xué)軟件開發(fā)學(xué)習(xí)英語(yǔ)非常重要,這樣的話我們就可以在邊敲代碼邊聽單詞。這樣下來(lái)就可以學(xué)到不少單詞,別有還有考試的功能,考生管理等,我就不說(shuō)了,加正題,于是我就把這個(gè)功能加到了這個(gè)呼加中心的項(xiàng)目上來(lái)了,讓我們這個(gè)呼叫中心有了語(yǔ)音閱讀的功能,和語(yǔ)音報(bào)時(shí)的功能,同時(shí)還可以有語(yǔ)音整點(diǎn)播報(bào),寫完了這個(gè)小功能我就放了半天,突然想到,現(xiàn)讀留言也是一個(gè)將概念于是我試著做了做,但由于時(shí)候的關(guān)系,我沒(méi)有做出來(lái)我沒(méi)有放棄,我想實(shí)現(xiàn)不了這功能,那就實(shí)現(xiàn)一個(gè)發(fā)語(yǔ)音郵件吧,發(fā)語(yǔ)音郵件就就要涉及到要錄音。因?yàn)橛肅#來(lái)控制Mic比較麻煩,我沒(méi)有做這個(gè),我想起來(lái)我原來(lái)的英語(yǔ)考試系統(tǒng)上也是有這種功能,這們我就把文字換成了語(yǔ)音以附件的形式發(fā)到郵件接收人的那里,這里Asp.net和C#是一點(diǎn)也不想同的我試了很多次,老天從來(lái)沒(méi)有讓我堅(jiān)持的事情失敗過(guò),我終于成功了,我高興的給我們同學(xué)了幾交OK成功!這只是一個(gè)小應(yīng)用,將來(lái)我會(huì)繼續(xù)研究語(yǔ)音技術(shù),爭(zhēng)取做一個(gè)我符合我想法軟件,來(lái)與社會(huì)分享
這是我寫錄音時(shí)用到的資料張貼出來(lái)和大家分享一下:
1 DirectSound是什么?
DirectSound 是微軟提供的DirectX API 的一部分。它使你能以極低的時(shí)延播放聲音,使應(yīng)用程序可以高度利用硬件資源。
2 DirectSound能做什么?
2.1 按照WAV格式播放聲音。
2.2 可以同時(shí)播放多種聲音。
2.3 將高優(yōu)先級(jí)的聲音分配給由硬件控制的緩沖區(qū)。
2.4 將普通的聲音融入自定的3D環(huán)境中。
2.5 可以給聲音添加不同的效果,比如回聲,合唱等。
2.6 從麥克風(fēng)或其它音頻輸入設(shè)備中捕獲WAV聲音。
3 DirectSound有哪些主要對(duì)象?
對(duì)象 | 說(shuō)明 | 作用 | .Net中的類或結(jié)構(gòu)體 |
設(shè)備對(duì)象 | 每個(gè)應(yīng)用程序只有一個(gè)設(shè)備對(duì)象 | 用來(lái)管理設(shè)備,創(chuàng)建輔助緩沖區(qū) | Microsoft.DirectX.DirectSound.Capture |
主緩沖區(qū) | 一個(gè)應(yīng)用程序只有一個(gè)主緩沖區(qū) | 操控聲音捕捉緩沖區(qū)和產(chǎn)生混音效果的區(qū)域 | Microsoft.DirectX.DirectSound.CaptureBuffer |
輔助緩沖區(qū) | 每一個(gè)聲音對(duì)應(yīng)一個(gè)輔助緩沖區(qū),可以有多個(gè)輔助緩沖區(qū) | 用來(lái)存儲(chǔ)要播放的聲音文件,可建立多個(gè)輔助緩沖區(qū)來(lái)放多個(gè)要播放的聲音文 | Microsoft.DirectX.DirectSound.SecondaryBuffer |
事件通知對(duì)象 | 一個(gè)緩沖區(qū)可以有多個(gè)通知對(duì)象 | 用于在緩沖區(qū)的特定點(diǎn)觸發(fā)通知事件,來(lái)通知程序執(zhí)行操作 | Microsoft.DirectX.DirectSound.Notify |
4 其它輔助對(duì)象
對(duì)象 | 作用 | .Net中的類或結(jié)構(gòu)體 |
音頻格式 | 定義WAV音頻格式,如采樣頻率、量化位數(shù)、聲道數(shù)等 | Microsoft.DirectX.DirectSound.WaveFormat |
通知的事件 | 通知正在等待的線程已發(fā)生事件 | System.Threading.AutoResetEvent |
5 必需知道的關(guān)鍵點(diǎn)
實(shí)在是太不厚道了?。。。。⌒量鄬懥税胩?,提交前沒(méi)有事先復(fù)制一份,結(jié)果提交了半天給我展示了一個(gè)“無(wú)法顯示該頁(yè)面”,害得我又得從上次保存的地方開始寫。真暈呀??!還不知道能不能記起剛才寫的。都有點(diǎn)不想寫了,可又覺(jué)得可惜??蓯海?!可惡??!
5.1 WAVE格式
WAVE是錄音時(shí)用的標(biāo)準(zhǔn)的WINDOWS文件格式,擴(kuò)展名為“WAV”,
我們使用DirectSound采集的WAV聲音,其音頻數(shù)據(jù)是按照PCM(脈沖編碼調(diào)制,對(duì)連續(xù)變化的模擬信號(hào)進(jìn)行抽樣、量化和編碼產(chǎn)生的數(shù)據(jù),0和1的組合)調(diào)制后放入緩沖區(qū)的。
WAVE文件格式采用RIFF文件格式結(jié)構(gòu),對(duì)PCM數(shù)據(jù)和其它一些音頻信息進(jìn)行相應(yīng)的編排,從而最終形成的WAVE文件才能被音頻播放器識(shí)別,才能進(jìn)行播放。
5.2 緩沖區(qū)指針
緩沖區(qū)是存放音頻數(shù)據(jù)的地方,并且它還提供了我們兩個(gè)指針:讀指針和捕捉指針。它們的位置按照相對(duì)于緩沖區(qū)起始位置的偏移量計(jì)算。讀指針位于當(dāng)前已經(jīng)被完全捕捉到緩沖區(qū)的數(shù)據(jù)末尾。捕捉指針位于當(dāng)前將要從硬件中復(fù)制的數(shù)據(jù)塊的末尾。如果你想從緩沖區(qū)中讀取數(shù)據(jù),則只能從已經(jīng)完全寫入緩沖區(qū)的數(shù)據(jù)中讀取,也就是說(shuō)我們只能從偏移量小于讀指針的地方讀取。
5.3 緩沖區(qū)通知
大家應(yīng)該都知道時(shí)間相同的音頻文件,WAVE文件會(huì)比其它格式的音頻文件大得多,這是因?yàn)閃AVE文件沒(méi)有對(duì)數(shù)據(jù)進(jìn)行壓縮。如果錄音的時(shí)候,不限制緩沖區(qū)大小,那么你錄制很短的時(shí)間可能就會(huì)占用很多內(nèi)存,說(shuō)不定不過(guò)多久,你的1G內(nèi)存就不夠用了。因此我們必須對(duì)緩沖區(qū)的大小進(jìn)行限制,而且當(dāng)緩沖區(qū)滿了之后,還可以重新從緩沖區(qū)起始處開始,用新的數(shù)據(jù)覆蓋舊的數(shù)據(jù)。那舊的數(shù)據(jù)怎么辦呢?如果你不想丟失舊的數(shù)據(jù),那就得在舊的數(shù)據(jù)被覆蓋之前,將它轉(zhuǎn)移到其它地方。
如何才能在舊的數(shù)據(jù)沒(méi)有被覆蓋之前,將它轉(zhuǎn)移走呢?如果是你,你會(huì)采用什么辦法?
聯(lián)系客服