模块很便宜,品牌叫天龙,在淘宝上搜来的。带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收中断,以读出数据方式清除标志
}
}
讯飞有SOC的语音识别的,TTS的也有。
PS:ARM7平台就足够了
你是说讯飞有自己的语音芯片?
客户若有足够的钱,可以雇专人坐在那里给他念数据。
客户若比银行钱多,也可以考虑采用比许多银行营业厅排队机那样烂的语音提示更自然的发音装置。
例如,你如果仅仅需要24小时各在整时报时一次,尽可以录24条语音信息,到点播一条。保证自然准确,还能多语种混合播报。但是如果信息复杂一点,这玩意就必须是提前编写的文字了。
我自己拿预录的30个字的那种模块来拼句子,除掉慢,个个字都发音完整,倒不比这模块差。
其实硬件不必动,软件略增加个拖腔(空白)处理就能在很大程度上解决问题。
一周热门 更多>