?? main.c
字號(hào):
//----------------------------------------------------------------------------
//-- 該程序是特定人辨識(shí)的一個(gè)范例:
//--
//-- 在程序中我們通過(guò)三條語(yǔ)句的訓(xùn)練演示特定人連續(xù)音識(shí)別,其中第一條語(yǔ)句為觸發(fā)命令。
//--
//-- 在程序一開(kāi)始為訓(xùn)練名稱(chēng),即觸發(fā)命令,然后提示訓(xùn)練兩條命令,訓(xùn)練完畢開(kāi)始辨識(shí)當(dāng)識(shí)別
//出觸發(fā)名稱(chēng)后,發(fā)布命令則會(huì)聽(tīng)到應(yīng)答,具體命令如下:
//****************訓(xùn)練******************************************
// 提示音 輸入語(yǔ)音
//--------------------------------------------------------
//"請(qǐng)輸入觸發(fā)名稱(chēng)" "警衛(wèi)"
//"請(qǐng)輸入第一條命令" "開(kāi)槍"
//"請(qǐng)輸入第二條命令" "你在干什么?"
//"請(qǐng)?jiān)僬f(shuō)一遍"(以上提示音每說(shuō)完一遍出現(xiàn)此命令)
//"沒(méi)有聽(tīng)到任何聲音"(當(dāng)沒(méi)有檢測(cè)到聲音時(shí)出現(xiàn)此命令)
//"兩次輸入名稱(chēng)不相同"(當(dāng)兩次輸入的名稱(chēng)不同時(shí)出現(xiàn)此命令)
//"兩次輸入命令不相同"(當(dāng)兩次輸入的命令有差異時(shí)出現(xiàn)此命令)
//"準(zhǔn)備就緒,請(qǐng)開(kāi)始辨識(shí)"(以上三條語(yǔ)句全部訓(xùn)練成功時(shí),進(jìn)入識(shí)別)
//*****************識(shí)別*****************************************
// 發(fā)布命令 應(yīng)答
//---------------------------------------------------------
//"警衛(wèi)" "在"/"長(zhǎng)官"
//"開(kāi)槍" "槍聲"
//"你在干什么?" "我在巡邏"/"我在休息"/"我在等人"
//注意:在每次提示音結(jié)束后2-3秒再輸入命令或當(dāng)上次應(yīng)答結(jié)束2-3秒后再發(fā)布命令
#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; //用于檢測(cè)是否有觸發(fā)命令,當(dāng)有識(shí)別出語(yǔ)句為觸發(fā)名稱(chēng)則該位置1
int gTriggerRespond[] = {RSP_MASTER, RSP_HERE, RSP_MASTER};//第一條命令應(yīng)答
int gComm2Respond[] = {RSP_PATROL, RSP_READY, RSP_COPY};//第二條命令應(yīng)答
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();//啟動(dòng)實(shí)時(shí)監(jiān)控
}
int TrainWord(int WordID, int RespondID)//命令訓(xùn)練
{
int res;
PlayRespond(RespondID);
while(1)
{
res = BSR_Train(WordID,BSR_TRAIN_TWICE);
if(res == 0) break;
switch(res)
{
case -1: //沒(méi)有檢測(cè)出聲音
PlayRespond(RSP_NOVOICE);
return -1;
case -2: //需要重新訓(xùn)練一遍
PlayRespond(RSP_AGAIN);
break;
case -3: //環(huán)境太吵
PlayRespond(RSP_NOISY);
return -1;
case -4: //數(shù)據(jù)庫(kù)滿(mǎn)
return -1;
case -5: //檢測(cè)出聲音不同
if(WordID == NAME_ID) PlayRespond(RSP_NAMEDIFF);//兩次輸入名稱(chēng)不同
else PlayRespond(RSP_CMDDIFF);//兩次輸入命令不同
return -1;
case -6: //序號(hào)錯(cuò)誤
return -1;
}
}
return 0;
}
int main()
{
int res, timeCnt=0, random_no=0;
BSR_DeleteSDGroup(0); // 初始化存儲(chǔ)器RAM
PlayRespond(RSP_INTR); //播放開(kāi)始訓(xùn)練的提示音
//..........訓(xùn)練名稱(chēng)..............................
while(TrainWord(NAME_ID,1) != 0) ;
//..........訓(xùn)練第一條命令.......................
while(TrainWord(COMMAND_ONE_ID,2) != 0) ;
//..........訓(xùn)練第二條命令.......................
while(TrainWord(COMMAND_TWO_ID,3) != 0) ;
//..........開(kāi)始識(shí)別命令.........................
BSR_InitRecognizer(BSR_MIC); //辨識(shí)器初始化
BSR_EnableCPUIndicator();
PlayRespond(RSP_STAR); // 播放開(kāi)始辨識(shí)的提示音
while(1)
{
random_no ++;
if(random_no >= 3) random_no = 0;
res = BSR_GetResult();
if(res > 0) //識(shí)別出命令
{
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) //超出定時(shí)
{
PlayRespond(RSP_NOVOICE); //在設(shè)定時(shí)間內(nèi)沒(méi)有檢測(cè)出聲音
gActivated = 0;
timeCnt = 0;
}
}
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -