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

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条回答
weixinal
1楼-- · 2020-02-10 10:19
 精彩回答 2  元偷偷看……
surf_131
2楼-- · 2020-02-10 15:05
weixinal 发表于 2012-5-11 23:14
科大讯飞是运行在高性能平台上的,至少arm9之上,而且其授权方式不能商业用途,条约中隐约有随时可以收回你 ...

我从淘宝上搜到了嵌入芯片的报价。有个“4240”还是什么很贵,另外有家抛“4040”型号的,便宜,只有几片。

这东西现在还无法达到语素合成而且带情绪表达吧?我买的这个,感觉就是建立一个语音库,再建立二级汉字库的索引,语音之间间隔比较大,就显出字字都顿一下,当然就很僵硬了。
weixinal
3楼-- · 2020-02-10 19:07
surf_131 发表于 2012-5-12 12:39
我从淘宝上搜到了嵌入芯片的报价。有个“4240”还是什么很贵,另外有家抛“4040”型号的,便宜,只有几片 ...

刚看了下4240,以前不知道科大讯飞还有这个玩意儿,不知道效果怎么样,不过可以肯定的是,准确表达语气情绪是不可能做到的。另外我刚看到这个4240的时候以为他是个单芯片解决方案,看了板子后面才知道还有个flash在后面。单片解决方案你看下syn6288
SNOOKER
4楼-- · 2020-02-11 01:01
这个模块是用STM8S103F2做的
weixinal
5楼-- · 2020-02-11 05:52
SNOOKER 发表于 2012-5-12 14:40
这个模块是用STM8S103F2做的

我卖的这个是f3p6
Delong_z
6楼-- · 2020-02-11 07:30
 精彩回答 2  元偷偷看……

一周热门 更多>