1. 新手求教 單片機TTS
你這個……用ARM吧(51應該也行),TTS我沒用過,但基本思路是:
存儲器裡面要有這些東西:
1、所有拼音四個聲調的頻率或者模塊
2、常用漢字拼音編碼表(就是根據漢字查出拼音)
3、聲音解碼。
4、喇嘛。
這些只能實現非常簡單的朗讀,因為漢字多音字很多。
要是我做,需要一個8051,一個MP3解碼晶元,一個漢字拼音編碼表,一個SD卡模塊
找真人錄音,找個字典把前面按拼音查找的地方,把每個音都念一遍錄下來變成MP3存在sd卡裡面,然後漢字編碼表有點大,89c516估計能放下,然後電腦串口輸入的漢字經過編碼表變成一個SD卡裡面的文件地址,然後控制MP3解碼晶元播放就行了。
這東西我沒研究過……你參考一下吧……
2. 怎麼讓單片機閱讀文字信息或者自動翻譯圖片上的文字
可以實現,
第一:你需要一個掃描器(千萬別指望單片機內部來完成),最好這個掃描器能自動識出文字(有嗎?我不知道,如果有也應該是掃描模塊)。然後把這個掃描器連接到單片機上(如何連接,取決於掃描模塊的介面,如I2C、PCI等);
第二:你需要外接一個語音合成晶元(別指望單片機來實現這個功能),將轉換的文字信息交給語音晶元來合成;
第三:你需要外接一個揚聲器,以便於發聲。
呵呵!這樣看來單片機只起到一個指揮的功能。
至於你說的用電腦來翻譯,只是把我說的第一步由電腦來完成,另外兩部分還是需要實現。至於讓單片機來閱讀你從電腦發送的(可通過串口或USB來實現)信息,還是別指望單片機來實現。
對了,由於信息量非常大,你可能需要擴展數據存儲器,不夠用。
3. 凌陽61單片機的優勢以及其在語音識別方面上的優勢
凌陽單片機本身具備語音識別功能,不需要外擴語音識別模塊,雖然具有一點點DSP功能,就能做到語音識別功能。如常見的語音控制機器人,語音控制小車等。
我們所說的音頻是指頻率在20 Hz~20 kHz的聲音信號,分為:波形聲音、語音和音樂三種,其中波形聲音就是自然界中所有的聲音,是聲音數字化的基礎。語音也可以表示為波形聲音,但波形聲音表示不出語言、語音學的內涵。語音是對講話聲音的一次抽象。是語言的載體,是人類社會特有的一種信息系統,是社會交際工具的符號。音樂與語音相比更規范一些,是符號化了的聲音。但音樂不能對所有的聲音進行符號化。樂譜是符號化聲音的符號組,表示比單個符號更復雜的聲音信息內容。
將模擬的(連續的)聲音波形數字元化(離散化),以便利數字計算機進行處理的過程,主要包括采樣和量化兩個方面。
數字音頻的質量取決於:采樣頻率和量化位數這兩個重要參數。此外,聲道的數目、相應的音頻設備也是影響音頻質量的原因
語音壓縮編碼中的數據量是指:數據量=(采樣頻率×量化位數)/8(位元組數) ×聲道數目。
壓縮編碼的目的:通過對資料的壓縮,達到高效率存儲和轉換資料的結果,即在保證一定聲音質量的條件下,以最小的資料率來表達和傳送聲音信息。
壓縮編碼的必要性:實際應用中,未經壓縮編碼的音頻資料量很大,進行傳輸或存儲是不現實的。 所以要通過對信號趨勢的預測和冗餘信息處理,進行資料的壓縮,這樣就可以使我們用較少的資源建立更多的信息。
舉個例子,沒有壓縮過的CD品質的資料,一分鍾的內容需要11MB的內存容量來存儲。如果將原始資料進行壓縮處理,在確保聲音品質不失真的前提下,將數據壓縮一半,5.5MB就可以完全還原效果。而在實際操作中,可以依需要來選擇合適的演算法。
常見的幾種音頻壓縮編碼:
1) 波形編碼:將時間域信號直接變換為數字代碼,力圖使重建語音波形保持原語音信號的波形形狀。波形編碼的基本原理是在時間軸上對模擬語音按一定的速率抽樣,然後將幅度樣本分層量化,並用代碼表示。解碼是其反過程,將收到的數字序列經過解碼和濾波恢復成模擬信號。
如:脈沖編碼調制(Pulse Code Molation,PCM)、差分脈沖編碼調制(DPCM)、增量調制(DM)以及它們的各種改進型,如自適應差分脈沖編碼調制(ADPCM)、自適應增量調制(ADM)、自適應傳輸編碼(Adaptive Transfer Coding,ATC)和子帶編碼(SBC)等都屬於波形編碼技術。
波形編碼特點:高話音質量、高碼率,適於高保真音樂及語音。
2) 參數編碼:參數編碼又稱為聲源編碼,是將信源信號在頻率域或其它正交變換域提取特徵參數,並將其變換成數字代碼進行傳輸。解碼為其反過程,將收到的數字序列經變換恢復特徵參量,再根據特徵參量重建語音信號。具體說,參數編碼是通過對語音信號特徵參數的提取和編碼,力圖使重建語音信號具有盡可能高的准確性,但重建信號的波形同原語音信號的波形可能會有相當大的差別。
如:線性預測編碼(LPC)及其它各種改進型都屬於參數編碼。該編碼比特率可壓縮到2Kbit/s-4.8Kbit/s,甚至更低,但語音質量只能達到中等,特別是自然度較低。
參數編碼特點:壓縮比大,計算量大,音質不高,廉價!
3) 混合編碼:混合編碼使用參數編碼技術和波形編碼技術,計算機的發展為語音編碼技術的研究提供了強有力的工具,大規模、超大規模集成電路的出現,則為語音編碼的實現提供了基礎。80年代以來,語音編碼技術有了實質性的進展,產生了新一代的編碼演算法,這就是混合編碼。它將波形編碼和參數編碼組合起來,克服了原有波形編碼和參數編碼的弱點,結合各自的長處,力圖保持波形編碼的高質量和參數編碼的低速率。
如:多脈沖激勵線性預測編碼(MPLPC),規劃脈沖激勵線性預測編碼(KPELPC),碼本激勵線性預測編碼(CELP)等都是屬於混合編碼技術。其數據率和音質介於參數和波形編碼之間。
總之,音頻壓縮技術之趨勢有兩個:
1)降低資料率,提高壓縮比,用於廉價、低保真場合(如:電話)。
2)追求高保真度,復雜的壓縮技術(如:CD)。
7.1.5 語音合成、辨識技術的介紹:
按照實現的功能來分,語音合成可分兩個檔次:
(1) 有限詞彙的計算機語音輸出
(2) 基於語音合成技術的文字語音轉換(TTS:Text-to-Speech)
按照人類語言功能的不同層次,語音合成可分為三個層次:
(1) 從文字到語音的合成(Text-to-Speech)
(2) 從概念到語音的合成(Concept-to-Speech)
(3) 從意向到語音的合成(Intention-to-Speech)
早期只能辨認特定的使用者即特定語者(Speaker Dependent,SD)模式,使用者可針對特定語者辨認詞彙(可由使用者自行定義,如人名聲控撥號),作簡單快速的訓練紀錄使用者的聲音特性來加以辨認。隨著技術的成熟,進入語音適應階段SA(speaker adaptation),使用者只要對於語音辨識核心,經過一段時間的口音訓練後,即可擁有不錯的辨識率。
2)非特定語者模式(Speaker Independent,SI),使用者無需訓練即可使用,並進行辨認。任何人皆可隨時使用此技術,不限定語者即男性、女性、小孩、老人皆可。
連續語音:
1)單字音辨認:為了確保每個字音可以正確地切割出來,必須一個字一個字分開來念,非常不自然,與我們平常說話的連續方式,還是有點不同。
2)整個句子辨識:只要按照你正常說話的速度,直接將要表達的說出來,中間並不需要停頓,這種方式是最直接最自然的,難度也最高,現階段連續語音的辨識率及正確率,雖然效果還不錯但仍需再提高。然而,中文字有太多的同音字,因此目前所有的中文語音辨識系統,幾乎都是以詞為依據,來判斷正確的同音字。
可辨認詞彙數量:
內建的詞彙資料庫的多寡,也直接影響其辨識能力。因此就語音辨識 的詞彙數量來說亦可分為三種:
1)小詞彙量(10-100)
2)中詞彙量(100-1000)
3)無限詞彙量(即聽寫機)
壓縮分無損壓縮和有損壓縮。
無損壓縮一般指:磁碟文件,壓縮比低:2:1~4:1。
而有損壓縮則是指:音/視頻文件,壓縮比可高達100:1。
凌陽音頻壓縮演算法根據不同的壓縮比分為以下幾種 (具體可參見語音壓縮工具一節內容):
SACM-A2000:壓縮比為8:1,8:1.25,8:1.5
SACM-S480: 壓縮比為80:3,80:4.5
SACM-S240: 壓縮比為80:1.5
按音質排序:A2000>S480>S240
凌陽的SPCE061A是16位單片機,具有DSP功能,有很強的信息處理能力,最高時鍾頻率可達到49MHz,具備運算速度高的優勢等等,這些都無疑為語音的播放、錄放、合成及辨識提供了條件。
凌陽壓縮演算法中SACM_A2000、SACM_S480、SACM_S240主要是用來放音,可用於語音提示,而DVR則用來錄放音。對於音樂合成MS01,該演算法較繁瑣,而且需要具備音樂理論、配器法及和聲學知識,所以對於特別愛好者可以到我們的網站去了解相關內容,這里只給出它的API函數介紹及程序代碼的範例,僅供參考。
在前面我們已經介紹過語音辨識的一些相關的內容,在這里我們給出SPCE061的特定語者辨識SD(Speaker Dependent)的一個例子以供有興趣者參考。SD即語音樣板由單個人訓練,也只能識別訓練某人的語音命令,而他人的命令識別率較低或幾乎不能識別。
同樣語音辨識也將其一些功能作成模塊,並通過API調用來實現這些功能,在這里我們為大家介紹一些常用的API函數,如果有興趣者可以登陸我們的網站去獲得更多的相關內容
初始化:
【API格式】C: int BSR_DeleteSDGroup(0);
ASM:F_BSR_DeleteSDGroup(0)
【功能說明】SRAM初始化。
【參 數】該參數是辨識的一個標識符,0代表選擇SRAM,並初始化。
【返 回 值】當SRAM擦除成功返回0,否則,返回-1。
訓練部分:
1) 【API格式】C:int BSR_Train (int CommandID, int TraindMode);
ASM:F_BSR_Train
【功能說明】訓練函數。
【參 數】
CommandID:命令序號,范圍從0x100到0x105,並且對於每組訓練語句都是唯一的。
TraindMode:訓練次數,要求使用者在應用之前訓練一或兩遍:
BSR_TRAIN_ONCE:要求訓練一次。
BSR_TRAIN_TWICE要求訓練兩次。
【返 回 值】訓練成功,返回0;沒有聲音返回-1;訓練需要更多的語音數據來訓練,返回-2;當環境太吵時,返回-3;當資料庫滿,返回-4;當兩次輸入命令不通,返回-5;當序號超出范圍,返回-6。
【備 注】
① 在調用訓練程序之前,確保識別器正確的初始化。
② 訓練次數是2時,則兩次一定會有差異,所以一定要保證兩次訓練結果接近
③ 為了增強可靠性,最好訓練兩次,否則辨識的命令就會傾向於噪音
④ 調用函數後,等待2秒開始訓練,每條命令只有1 .3秒,也就是說,當訓練命令超出1.3秒時,只有前1.3秒命令有效。
辨識部分:
1)【API格式】C: void BSR_InitRecognizer(int AudioSource)
ASM:F_BSR_InitRecognizer
【功能說明】辨識器初始化。
【參 數】 定義語音輸入來源。通過MIC語音輸入還是LINE_IN電壓模擬量輸入。
【返 回 值】無。
2)【API格式】C:int BSR_GetResult();
ASM:F_ BSR_GetResult
【返回值】=R1
【功能說明】辨識中獲取數據。
【參 數】 無。
【返 回 值】
當無命令識別出來時,返回0;
識別器停止未初始化或識別未激活返回-1;
當識別不合格時返回-2;
當識別出來時返回命令的序號。
` 【備 注】 該函數用於啟動辨識,BSR_GetResult();
3)【API格式】C: void BSR_StopRecognizer(void);
ASM:F_ BSR_StopRecognizer
【功能說明】停止辨識。
【參 數】無。
【返 回 值】 無。
【備 注】該函數是用於停止識別,當調用此函數時,FIQ_TMA中斷將關閉。
中斷部分:
【API格式】 ASM:_BSR_InitRecognizer
【功能說明】 在中斷中調用,並通過中斷將語音信號送DAC通道播放。
【參 數】無。
【返 回 值】無。
【備 注】
① 該函數在中斷FIQ_TMA中調用
② 當主程序調用BSR_InitRecognizer時,辨識器便打開8K采樣率的FIQ_TMA中斷並開始將采樣的語音數據填入辨識器的數據隊列中。
③ 應用程序需要設置一下程序段在FIQ_TMA中:
.PUBLIC _FIQ
.EXTERNAL _BSR_FIQ_Routine //定義全局變數
.TEXT
_FIQ:
PUSH R1,R4 to [SP] //寄存器入棧保護
R1 = [P_INT_Ctrl]
CALL _BSR_FIQ_Routine //調用子程序
R1 = 0x2000 //清中斷標志位
[P_INT_Clear] = R1
POP R1,R4 from [SP]; //寄存器組出棧
RETI
END
以下是特定人辨識的一個範例:
在程序中我們通過三條語句的訓練演示特定人連續音識別,其中第一條語句為觸發名稱。另外兩條為命令,訓練完畢開始辨識當識別出觸發名稱後,開始發布命令,則會聽到自己設置的應答,具體命令如下:
****************訓練******************************************
提示音 輸入語音
--------------------------------------------------------------------------------------------------------
"請輸入觸發名稱" "警衛"
"請輸入第一條命令" "開槍"
"請輸入第二條命令" "你在干什麼?"
"請再說一遍"(以上提示音每說完一遍出現此命令)
"沒有聽到任何聲音"(當沒有檢測到聲音時出現此命令)
"兩次輸入名稱不相同"(當兩次輸入的名稱不同時出現此命令)
"兩次輸入命令不相同"(當兩次輸入的命令有差異時出現此命令)
"准備就緒,請開始辨識"(以上三條語句全部訓練成功時,進入識別)
*****************識別**********************************************************************
發布命令 應答
----------------------------------------------------------------------------------------------------------
"警衛" "在"/"長官"
"開槍" "槍聲"
"你在干什麼?" "我在巡邏"/"我在休息"/"我在等人"
注意:在每次提示音結束後2-3秒再輸入命令或當上次應答結束2-3秒後再發布命令
#INCLUDE "bsrsd.h"
#DEFINE NAME_ID 0x100
#DEFINE COMMAND_ONE_ID 0x101
#DEFINE COMMAND_TWO_ID 0x102
#DEFINE RSP_INTR 0
#DEFINE RSP_NAME 1
#DEFINE RSP_FIRE 2
#DEFINE RSP_GUARD 3
#DEFINE RSP_AGAIN 4
#DEFINE RSP_NOVOICE 5
#DEFINE RSP_NAMEDIFF 6
#DEFINE RSP_CMDDIFF 7
#DEFINE RSP_STAR 8
#DEFINE RSP_MASTER 9
#DEFINE RSP_HERE 10
#DEFINE RSP_GUNSHOT 0
#DEFINE RSP_PATROL 11
#DEFINE RSP_READY 12
#DEFINE RSP_COPY 13
#DEFINE RSP_NOISY 14
//..................全程變數..................……………………………………………………………………….
int gActivated = 0;
//該變數用於檢測是否有觸發命令,當有識別出語句為觸發名稱則該位置1
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};
//第一條命令應答
int gComm2Respond[] = {RSP_PATROL, RSP_READY, RSP_COPY};
//第二條命令應答
extern void ClearWatchDog();
int PlayFlag = 0;
void PlayRespond2(int Result)
//槍聲放音子程序
{
BSR_StopRecognizer();
SACM_A2000_Initial(1);
SACM_A2000_Play(Result, 3, 3);
while((SACM_A2000_Status()&0x0001) != 0)
{
SACM_A2000_ServiceLoop();
ClearWatchDog();
}
SACM_A2000_Stop();
BSR_InitRecognizer(BSR_MIC);
BSR_EnableCPUIndicator();
}
void PlayRespond(int Result) //放音子程序
{
BSR_StopRecognizer();
SACM_S480_Initial(1);
SACM_S480_Play(Result, 3, 3);
while((SACM_S480_Status()&0x0001) != 0)
{
SACM_S480_ServiceLoop();
ClearWatchDog();
}
SACM_S480_Stop();
BSR_InitRecognizer(BSR_MIC);
BSR_EnableCPUIndicator(); //啟動實時監控
}
int TrainWord(int WordID, int RespondID) //命令訓練
{
int res;
PlayRespond(RespondID);
while(1)
{
res = BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res == 0) break;
switch(res)
{
case -1: //沒有檢測出聲音
PlayRespond(RSP_NOVOICE);
return -1;
case -2: //需要重新訓練一遍
PlayRespond(RSP_AGAIN);
break;
case -3: //環境太吵
PlayRespond(RSP_NOISY);
return -1;
case -4: //資料庫滿
return -1;
case -5: //檢測出聲音不同
if(WordID == NAME_ID)
PlayRespond(RSP_NAMEDIFF); //兩次輸入名稱不同
else
PlayRespond(RSP_CMDDIFF);//兩次輸入命令不同
return -1;
case -6: //序號錯誤
return -1;
}
}
return 0;
}
int main()
{
int res, timeCnt=0, random_no=0;
BSR_DeleteSDGroup(0); // 初始化存儲器為RAM
PlayRespond(RSP_INTR); //播放開始訓練的提示音
//..........訓練名稱..............................
while(TrainWord(NAME_ID,1) != 0) ;
//..........訓練第一條命令.......................
while(TrainWord(COMMAND_ONE_ID,2) != 0) ;
//..........訓練第二條命令.......................
while(TrainWord(COMMAND_TWO_ID,3) != 0) ;
//..........開始識別命令.........................
BSR_InitRecognizer(BSR_MIC); //辨識器初始化
BSR_EnableCPUIndicator();
PlayRespond(RSP_STAR); // 播放開始辨識的提示音
while(1)
{
random_no ++;
if(random_no >= 3) random_no = 0;
res = BSR_GetResult();
if(res > 0) //識別出命令
{
if(gActivated)
{
timeCnt = 0;
switch(res)
{
case NAME_ID:
PlayRespond(gTriggerRespond[random_no]);
break;
case COMMAND_ONE_ID:
PlayFlag = 1;
PlayRespond2(RSP_GUNSHOT);
PlayFlag = 0;
gActivated = 0;
break;
case COMMAND_TWO_ID:
PlayRespond(gComm2Respond[random_no]);
gActivated = 0;
}
}
else
{
if(res == NAME_ID)
{PlayRespond(gTriggerRespond[random_no]);
gActivated = 1;
timeCnt = 0;
}
}
}
else if (gActivated)
{
if (++timeCnt > 450) //超出定時
{PlayRespond(RSP_NOVOICE); //在設定時間內沒有檢測出聲音
gActivated = 0;
timeCnt = 0;
}
}
}
}
中斷程序:
.PUBLIC _FIQ
.EXTERNAL _BSR_FIQ_Routine
.EXTERNAL __gIsStopRecog //變數值 = 0 辨識器忙
// = 1 辨識器停止
.PUBLIC _BREAK,_IRQ0, _IRQ1, _IRQ2, _IRQ3, _IRQ4, _IRQ5, _IRQ6, _IRQ7
.EXTERNAL _PlayFlag
.INCLUDE s480.inc;
.INCLUDE A2000.inc;
.INCLUDE resource.inc
.INCLUDE hardware.inc
.TEXT
_FIQ:
push R1,R4 to [SP]
R1 = [P_INT_Ctrl]
R1 &= 0x2000
jz ?notTimerA //當不為TIQ_TMA,則轉
R1 = [__gIsStopRecog]
jnz ?BSR_NotBusy
//[__gIsStopRecog]為1則轉至放音處理
call _BSR_FIQ_Routine //為0,調用辨識子程序
jmp ?BSR_Busy //返回中斷
?BSR_NotBusy: //放音處理
R2 = [_PlayFlag]
jnz ?Play2000 //[_PlayFlag]為1則是播放2000
call F_FIQ_Service_SACM_S480; //為0,播放480
jmp ?BSR_Busy //返回中斷
?Play2000: //2000播放子程序
call F_FIQ_Service_SACM_A2000;
?BSR_Busy: //返回中斷
R1 = 0x2000
[P_INT_Clear] = R1
pop R1,R4 from [SP];
reti;
?notTimerA:
R1 = 0x8800;
[P_INT_Clear] = R1;
pop R1,R4 from [SP];
reti;
.END
4. 單片機中的語音播報可以加入變數嗎,例如速度在不斷發生改變,播報的值也變化
可以的~~
使用TTS語音合成模塊就可以,按照它的控制協議,構建播放內容數據,發給它就可以播放。
型號應該是SYN6288