智能车制作

标题: 语音问题求各位大神帮助呀~~~~~~~(>_<)~~~~ [打印本页]

作者: 静亦涟漪    时间: 2012-8-19 11:53
标题: 语音问题求各位大神帮助呀~~~~~~~(>_<)~~~~
自己想做一个语音的智能车……代码现在写到菜单式语音识别系统了……用 ASR M08-A 模块 但是模块同一时刻只支持50条关键词角度变化满足不了需求。
因为,ASR M08-A是支持动态编辑关键词列表的,所以可以利用这个功能做成菜单式的语音识别系统。
举例:做一个语音点歌系统
1. 首先,第一个菜单为歌手的名字,如陈奕迅、郭富城、卓依婷……
2. 当用户说出“陈奕迅”时,系统马上发送添加关键词指令将陈奕迅的所有歌曲
名一条条的添加进去。
3. 当用户说出歌名“我的背包”,然后播放音乐“我的背包.MP3”

但是代码写的不对……~~~~(>_<)~~~~ 求指导……



我写的 gequ1和gequ2是发送添加关键词指令
          play_list1和play_list2是播放歌曲指令
#include <at89x51.h>
unsigned char a;          //a用来存放串口接收到的数据
unsigned char gequ1[2][12]=
{0x30,0x31,0x2C,0x79,0x69,0x2C,0x30,0x30,0x32,0x2C,0x24,0xA0,
0x30,0x32,0x2C,0x73,0x61,0x6E,0x2C,0x30,0x30,0x33,0x2C,0x24};
unsigned char gequ2[2][12]=
{0x31,0x31,0x2C,0x79,0x69,0x2C,0x30,0x31,0x32,0x2C,0x24,0xA0,
0x31,0x32,0x2C,0x73,0x61,0x6E,0x2C,0x30,0x31,0x33,0x2C,0x24};
unsigned char play_list1[2][10]=
{0x70,0x6C,0x61,0x79,0x2C,0x30,0x30,0x32,0x2C,0x24,
0x70,0x6C,0x61,0x79,0x2C,0x30,0x30,0x33,0x2C,0x24};
unsigned char play_list2[2][10]=
{0x70,0x6C,0x61,0x79,0x2C,0x30,0x31,0x32,0x2C,0x24,
0x70,0x6C,0x61,0x79,0x2C,0x30,0x31,0x33,0x2C,0x24,};
int i,k,j;
unsigned char play[10];

void init()
{
        TMOD=0x20;//定时器1使用初值自动重装方式,方式2
        TH1=0xfd;
        TL1=0xfd;//9600波特率初值
        TR1=1;//允许定时器计数
        SM0=0;//方式1设置
        SM1=1;
        REN=1; //允许串口接收
        EA=1;  //开总中断
        ES=1;  //开串口中断
}  
main()
{        init();
        while(1)
{                if(a==1)
                   {
                        for(i=0;i<2;i++)
                        {       
                                for(k=0;k<12;k++)
                                SBUF=gequ1[i][k];
                                while(!TI);
                             TI=0;
                        }
                       
                        REN=0;
                        EA=0;
                        ES=0;
                       
                        TMOD=0x02;//定时器0使用初值自动重装方式,方式2
                        TH0=0xfd;
                        TL0=0xfd;//9600波特率初值
                        TR0=1;//允许定时器计数
                        SM0=0;//方式1设置
                        SM1=1;
                        REN=1; //允许串口接收
                        EA=1;  //开总中断
                        ES=1;  //开串口中断

                        while(1)
                  {        play[10]=play_list1[a-2];          //第二次中断接收到的a
                    for(j=0;j<10;j++)
                        {       
                                SBUF=play[j];
                             while(!TI);
                             TI=0;
                        }
                     }   
                   }

               
                if(a==11)
                   {
                        for(i=0;i<2;i++)
                        {       
                                for(k=0;k<12;k++)
                                SBUF=gequ2[i][k];
                                while(!TI);
                             TI=0;

                        }
                       
                        REN=0;
                        EA=0;
                        ES=0;
                       
                        TMOD=0x02;//定时器0使用初值自动重装方式,方式2
                        TH0=0xfd;
                        TL0=0xfd;//9600波特率初值
                        TR0=1;//允许定时器计数
                        SM0=0;//方式1设置
                        SM1=1;
                        REN=1; //允许串口接收
                        EA=1;  //开总中断
                        ES=1;  //开串口中断

                        while(1)
                  {        play[10]=play_list2[a-12];          //第二次中断接收到的a
                    for(j=0;j<10;j++)
                        {       
                                SBUF=play[j];
                             while(!TI);
                             TI=0;
                        }
                     }   
                   }


                else;
}
          

}

void serial() interrupt 4 //串口中断函数
{
   if(RI==1)//如果是接收中断,进行下面工作
        {
                a=SBUF;//串口接收到到的数据存放到a中
                RI=0;//接收中断标志位标志
        }
        if(TI==1)//如果是发送中断,直接清零发送中断标志,不做任何工作
        {
                TI=0; //发送中断标志位清零
        }
}


我还是单片机小白阶段{:soso_e154:}




//具体内容参考

//===========================本程序功能===========================//
//上电后单片机自动发送“Play,001,$”指令播放SD卡中0001.AD4音频文件//
//客户可参考此程序编写单片机添加关键词程序等。
//================================================================//
#include <at89x51.h>
unsigned char PLAY[]={0x70,0x6C,0x61,0x79,0x2C,0x30,0x30,0x31,0x2C,0x24};
//“PLAY_0001_AD4[]”这个数组为"lay,001,$"指令转换为ASCII码后的指令码数组
main()
{
           unsigned char i;
        TMOD=0x20;
        TH1=0xfd;
        TL1=0xfd;//9600波特率
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
    ES=0;
    for(i=0;i<10;i++)//i为PLAY_0001_AD4数组的元素个数
        {
             SBUF=PLAY[i];
             while(!TI);
             TI=0;
        }
        while(1);
}


{:soso_e183:}{:soso_e183:}{:soso_e183:}{:soso_e183:}{:soso_e183:}{:soso_e183:}

作者: yukunlinykl    时间: 2012-8-19 15:01
问错地方了吧。
作者: 静亦涟漪    时间: 2012-8-19 19:19
yukunlinykl 发表于 2012-8-19 15:01
问错地方了吧。

e...那应该问在哪= =!

作者: 山水    时间: 2012-9-25 14:20





欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2