[原创]廉价语音模块试用实例

2020-02-08 09:09发布

模块很便宜,品牌叫天龙,在淘宝上搜来的。带2首背景曲,15个音效,女声发音。
tts_2.jpg (96.67 KB, 下载次数: 2) 下载附件 2012-5-11 12:06 上传

程序实际跑通的。BUSY信号送到RB0, RST连接到RD7。串口连接RD4/RD5

//USART2,连接汉语语音合成芯片组件TTS。RD4设为TX2(对语音芯片的RX),RD5设为RX2,
//RB0连接BUSY
//RD7作为模块RESET。开启U2_RC中断响应,以便重启TTS之后不被吊死
#include <P18f46j11.h>
#include <usart.h>
#include <timers.h>
#include <stdlib.h>
#include <delays.h>
#define LED1 LATDbits.LATD2

//以下预先声明各个函数
void main (void);
void InterruptHandlerHigh (void);

unsigned char u2_rc;
//***************主函数*****************
void main()
{
unsigned char i,j;
//**************USART2 INIT**********************
EECON2=0x55;                        //修改重定位锁定标志前的必须序列
EECON2=0xAA;
PPSCONbits.IOLOCK=0;                                //打开重定向锁
RPINR16=22;                                                        //RX2赋予RP22(RD5)
RPOR21=5;                                                `        //TX2连接到RP21(RD4)
EECON2=0x55;                        //修改重定位锁定标志前的必须序列
EECON2=0xAA;
PPSCONbits.IOLOCK=1;                                //关闭重定向锁
Close2USART();                                                //关闭串口
//下句打开串口2,收中断,高速,9600
Open2USART( USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_LOW,51 );
RCSTA2bits.ADDEN=0;                                        //消除9位通信的地址相关设置
BAUDCON2bits.ABDOVF=0;                                //将波特率计满指示清0
BAUDCON2bits.RXDTP=0;                                //将空闲反相关闭
BAUDCON2bits.BRG16=1;                                //选择16位波特率
ANCON1bits.PCFG12=1;                                //RB0(AN12)=IO
TRISBbits.TRISB0=1;                                        //
//****************INTERRUPT INIT*******************
INTCONbits.PEIE=1;
INTCONbits.GIE=1;
//**************************IO INIT********************
TRISDbits.TRISD2=0;                //RD2 led output
TRISDbits.TRISD7=0;                //RD7 TTS模块RESET
//*********TTS RESET**************************
LATDbits.LATD7=0;
Delay1KTCYx(150);                                        //减慢发送速度而设
Delay1KTCYx(150);                                        //减慢发送速度而设
LATDbits.LATD7=1;
Delay1KTCYx(150);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<N>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<W>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<X>1");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<M>0");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<G>x18 ,老婆大人,你好!x13");     
Delay1KTCYx(100);                                        //减慢发送速度而设
putrs2USART("<I>2");                                ////have a try
Delay1KTCYx(100);                                        //减慢发送速度而设
while (!TXSTA2bits.TRMT);
putrs2USART("<G>x11 你来啦!今天天气真好 x12");                                //a try
while (!TXSTA2bits.TRMT);
putrs2USART("x14 请你吃西瓜,你先吃大边,你再吃小边 x15");                                //a try
while (!TXSTA2bits.TRMT);
putrs2USART("x16 有时间咱们去人人乐超市吧? x17");                                //a try

//**************************主循环************************
while(1)
{
Delay1KTCYx(100);                                        //减慢发送速度而设
if (PORTBbits.RB0)
LED1=1;                                                                //测试指示
else
LED1=0;                                                                //测试指示
//到达MAIN最后部分
}
}

//----------------------------------------------------------------------------
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void
InterruptVectorHigh (void)
{
  _asm
    goto InterruptHandlerHigh   //jump to interrupt routine
  _endasm
}
//----------------------------------------------------------------------------
// High priority interrupt routine
#pragma code
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh ()
{
if (INTCONbits.TMR0IF)
{                           //check for TMR0 overflow
INTCONbits.TMR0IF = 0;        //clear interrupt flag
}
else if (PIR3bits.RC2IF)
{
u2_rc = RCREG2;                //若USART2收中断,以读出数据方式清除标志
}
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
34条回答
chinmel
1楼-- · 2020-02-11 13:13
weixinal 发表于 2012-5-11 23:14
科大讯飞是运行在高性能平台上的,至少arm9之上,而且其授权方式不能商业用途,条约中隐约有随时可以收回你 ...

讯飞有SOC的语音识别的,TTS的也有。
PS:ARM7平台就足够了
weixinal
2楼-- · 2020-02-11 16:46
chinmel 发表于 2012-6-26 11:57
讯飞有SOC的语音识别的,TTS的也有。
PS:ARM7平台就足够了

你是说讯飞有自己的语音芯片?
1181zjf
3楼-- · 2020-02-11 17:29
这个效果做产品,客户难接受啊!
surf_131
4楼-- · 2020-02-11 20:44
1181zjf 发表于 2012-6-29 13:01
这个效果做产品,客户难接受啊!

客户若有足够的钱,可以雇专人坐在那里给他念数据。

客户若比银行钱多,也可以考虑采用比许多银行营业厅排队机那样烂的语音提示更自然的发音装置。

例如,你如果仅仅需要24小时各在整时报时一次,尽可以录24条语音信息,到点播一条。保证自然准确,还能多语种混合播报。但是如果信息复杂一点,这玩意就必须是提前编写的文字了。
1181zjf
5楼-- · 2020-02-12 01:11
 精彩回答 2  元偷偷看……
surf_131
6楼-- · 2020-02-12 05:58
我大概发现我手上的这个型号,直接从喇叭出音频,每条(单字)都是差一点播完就抢播下一个字,然而不知何故频率总是一字高一字低,让低音调的字听不清楚。
我自己拿预录的30个字的那种模块来拼句子,除掉慢,个个字都发音完整,倒不比这模块差。
其实硬件不必动,软件略增加个拖腔(空白)处理就能在很大程度上解决问题。

一周热门 更多>