HNGHT2011 发表于 2014-4-16 21:11:44

Arduino2560 与语音芯片Syn6628语音播放程序问题,附有程序

关于程序结构的求助。
第一次接触Arduino,想要结合Syn6628语音芯片,做一个语音播报系统。
其中播放的语音子函数speech(1,2,3,4)是由Arduino_LPTTS函数生成器生成。通过按一个键
输出一个相应的语音。现在的问题是
loop函数中该怎么调用speech(1,2,3,4),我写的程序太简单,有一些有问题。当正播放一个语音时,按下另一个按键以播放另一句语音时,有6、7秒的反应时间,而且有时会进入死循环。该怎么修改程序结构解决这些问题,请各位高手指教。


程序如下:
int key1=4;//按下该键播放语音语音1
int key2=5;//按下该键播放语音语音2
int key3=6;//按下该键播放语音语音3
int key4=7;//按下该键播放语音语音4

int state1=0;
int state2=0;
int state3=0;
int state4=0;


9//语音子函数speech(1,2,3,4)是由Arduino_LPTTS函数生成器自动生成
//1、黄绮珊剪爱
void speech1()
{
unsigned char i = 0;
unsigned char head;

head = 0xFD;
head = 0x00;
head = 0x0F;
head = 0x01;
head = 0x08;
head = 0xBB;
head = 0xC6;
head = 0xE7;
head = 0xB2;
head = 0xC9;
head = 0xBA;
head = 0x20;
head = 0x20;
head = 0xBC;
head = 0xF4;
head = 0xB0;
head = 0xAE;
head = 0xF6;

for(i=0; i<18; i++){
    Serial.write(head);
}
}


//2、我们都是
void speech2()
{
unsigned char i = 0;
unsigned char head;

head = 0xFD;
head = 0x00;
head = 0x23;
head = 0x01;
head = 0x08;
head = 0xCE;
head = 0xD2;
head = 0xC3;
head = 0xC7;
head = 0xB6;
head = 0xBC;
head = 0xCA;
head = 0xC7;
head = 0xBA;
head = 0xC3;
head = 0xBA;
head = 0xA2;
head = 0xD7;
head = 0xD3;
head = 0xA3;
head = 0xAC;
head = 0xCA;
head = 0xB7;
head = 0xC9;
head = 0xCF;
head = 0xD7;
head = 0xEE;
head = 0xC9;
head = 0xC6;
head = 0xC1;
head = 0xBC;
head = 0xB5;
head = 0xC4;
head = 0xBA;
head = 0xA2;
head = 0xD7;
head = 0xD3;
head = 0xFF;

for(i=0; i<38; i++){
    Serial.write(head);
}
}

//3、请关闭电源,锁好门窗
void speech3(){
unsigned char i = 0;
unsigned char head;

head = 0xFD;
head = 0x00;
head = 0x17;
head = 0x01;
head = 0x00;
head = 0xC7;
head = 0xEB;
head = 0xB9;
head = 0xD8;
head = 0xB1;
head = 0xD5;
head = 0xB5;
head = 0xE7;
head = 0xD4;
head = 0xB4;
head = 0xA3;
head = 0xAC;
head = 0xCB;
head = 0xF8;
head = 0xBA;
head = 0xC3;
head = 0xC3;
head = 0xC5;
head = 0xB4;
head = 0xB0;
head = 0xB7;

for(i=0; i<26; i++){
    Serial.write(head);
}
}
//4、一帆风顺,一路平安
void speech4()
{
unsigned char i = 0;
unsigned char head;

head = 0xFD;
head = 0x00;
head = 0x15;
head = 0x01;
head = 0x50;
head = 0xD2;
head = 0xBB;
head = 0xB7;
head = 0xAB;
head = 0xB7;
head = 0xE7;
head = 0xCB;
head = 0xB3;
head = 0xA3;
head = 0xAC;
head = 0xD2;
head = 0xBB;
head = 0xC2;
head = 0xB7;
head = 0xC6;
head = 0xBD;
head = 0xB0;
head = 0xB2;
head = 0x8E;

for(i=0; i<24; i++){
    Serial.write(head);
}
}

void setup()
{
Serial.begin(9600);
pinMode(key1,INPUT);
pinMode(key2,INPUT);
pinMode(key3,INPUT);
pinMode(key4,INPUT);
}
void loop()
{
state1=digitalRead(key1);
if(state1==HIGH)
{
    delay(20);//延时去斗
    state1=digitalRead(key1);
    if(state1==HIGH)
    speech1();
}

   state2=digitalRead(key2);
   if(state2==HIGH)
{
    delay(20);
    state2=digitalRead(key2);
    if(state2==HIGH)
    speech2();
}

state3=digitalRead(key3);
if(state3==HIGH)
{
    delay(20);
    state3=digitalRead(key3);
    if(state3==HIGH)
    speech3();
}

state4=digitalRead(key4);
if(state4==HIGH)
{
    delay(20);
    state4=digitalRead(key4);
    if(state4==HIGH)
    speech4();
}

}

HNGHT2011 发表于 2014-4-17 08:28:49

程序能运行,就是感觉太粗糙了,请高手给点建议!

HNGHT2011 发表于 2014-4-17 08:49:53

程序能用,但就是有些问题。在loop程序中,调用speech函数时,串口会将该函数发送到语音芯片,在语音芯片中就会自动播放,而在loop函数又会读取I/O口的键盘key输入信号,当芯片读取到有key有输入时,又会调用speech函数时,串口会将该函数发送到语音芯片,在串口传递speech函数时会需要一段时间,所以不同语音切换时会有5、6秒的延迟,这就是我对程序的理解。但感觉loop中对speech函数调用程序太简陋不严密,频繁按键盘时语音芯片会播放乱码。该怎么修改,请各位高手指教!

HNGHT2011 发表于 2014-4-18 08:25:12

HNGHT2011 发表于 2014-4-17 08:49 static/image/common/back.gif
程序能用,但就是有些问题。在loop程序中,调用speech函数时,串口会将该函数发送到语音芯片,在语音芯片中 ...

大家没用过syn6288吗,但程序.....:'(

eddiewwm 发表于 2014-4-19 12:51:46

HNGHT2011 发表于 2014-4-17 08:49 static/image/common/back.gif
程序能用,但就是有些问题。在loop程序中,调用speech函数时,串口会将该函数发送到语音芯片,在语音芯片中 ...

沒用過syn6288,看來程序很直接,而所述的"串口传递speech函数时会需要一段时间,所以不同语音切换时会有5、6秒的延迟",應是硬件的響應問題。
理論上,若要播放新的一段前,應發控制碼先把現播放的停止清除,才發新的一段播放碼才比較合理!

HNGHT2011 发表于 2014-4-19 16:21:23

eddiewwm 发表于 2014-4-19 12:51 static/image/common/back.gif
沒用過syn6288,看來程序很直接,而所述的"串口传递speech函数时会需要一段时间,所以不同语音切换时会有 ...

谢谢你的意见,我找到了问题,确实是硬件问题!

chuhaibo 发表于 2015-3-20 19:36:38

HNGHT2011 发表于 2014-4-17 08:28 static/image/common/back.gif
程序能运行,就是感觉太粗糙了,请高手给点建议!

你好,我也在用syn6288 做语音播报 可是完全没有声音请问你有什么建议吗

风一样的男子 发表于 2017-8-23 09:43:32

你好,我运行程序的时候编译有误:Arduino:1.6.5 (Windows 8.1), 板:"Arduino Uno"

构建选项已变更,全部重新构建

__.ino: In function 'void speech1()':
__:39: error: call of overloaded 'write(unsigned char )' is ambiguous
__.ino:39:22: note: candidates are:
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224:0,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note: virtual size_t HardwareSerial::write(uint8_t) <near match>
   virtual size_t write(uint8_t);
                  ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note:   no known conversion for argument 1 from 'unsigned char ' to 'uint8_t {aka unsigned char}'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note: size_t HardwareSerial::write(long unsigned int) <near match>
   inline size_t write(unsigned long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note: size_t HardwareSerial::write(long int) <near match>
   inline size_t write(long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note: size_t HardwareSerial::write(unsigned int) <near match>
   inline size_t write(unsigned int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note: size_t HardwareSerial::write(int) <near match>
   inline size_t write(int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'int'
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*) <near match>
   size_t write(const char *str) {
            ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note:   no known conversion for argument 1 from 'unsigned char ' to 'const char*'
__.ino: In function 'void speech2()':
__:90: error: call of overloaded 'write(unsigned char )' is ambiguous
__.ino:90:22: note: candidates are:
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224:0,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note: virtual size_t HardwareSerial::write(uint8_t) <near match>
   virtual size_t write(uint8_t);
                  ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note:   no known conversion for argument 1 from 'unsigned char ' to 'uint8_t {aka unsigned char}'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note: size_t HardwareSerial::write(long unsigned int) <near match>
   inline size_t write(unsigned long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note: size_t HardwareSerial::write(long int) <near match>
   inline size_t write(long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note: size_t HardwareSerial::write(unsigned int) <near match>
   inline size_t write(unsigned int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note: size_t HardwareSerial::write(int) <near match>
   inline size_t write(int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'int'
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*) <near match>
   size_t write(const char *str) {
            ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note:   no known conversion for argument 1 from 'unsigned char ' to 'const char*'
__.ino: In function 'void speech3()':
__:127: error: call of overloaded 'write(unsigned char )' is ambiguous
__.ino:127:22: note: candidates are:
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224:0,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note: virtual size_t HardwareSerial::write(uint8_t) <near match>
   virtual size_t write(uint8_t);
                  ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note:   no known conversion for argument 1 from 'unsigned char ' to 'uint8_t {aka unsigned char}'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note: size_t HardwareSerial::write(long unsigned int) <near match>
   inline size_t write(unsigned long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note: size_t HardwareSerial::write(long int) <near match>
   inline size_t write(long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note: size_t HardwareSerial::write(unsigned int) <near match>
   inline size_t write(unsigned int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note: size_t HardwareSerial::write(int) <near match>
   inline size_t write(int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'int'
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*) <near match>
   size_t write(const char *str) {
            ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note:   no known conversion for argument 1 from 'unsigned char ' to 'const char*'
__.ino: In function 'void speech4()':
__:162: error: call of overloaded 'write(unsigned char )' is ambiguous
__.ino:162:22: note: candidates are:
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224:0,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note: virtual size_t HardwareSerial::write(uint8_t) <near match>
   virtual size_t write(uint8_t);
                  ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:124:20: note:   no known conversion for argument 1 from 'unsigned char ' to 'uint8_t {aka unsigned char}'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note: size_t HardwareSerial::write(long unsigned int) <near match>
   inline size_t write(unsigned long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:125:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note: size_t HardwareSerial::write(long int) <near match>
   inline size_t write(long n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:126:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'long int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note: size_t HardwareSerial::write(unsigned int) <near match>
   inline size_t write(unsigned int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:127:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'unsigned int'
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note: size_t HardwareSerial::write(int) <near match>
   inline size_t write(int n) { return write((uint8_t)n); }
                   ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:128:19: note:   no known conversion for argument 1 from 'unsigned char ' to 'int'
In file included from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
               from F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Arduino.h:224,
               from __.ino:1:
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note: size_t Print::write(const char*) <near match>
   size_t write(const char *str) {
            ^
F:\arduino-1.6.5\hardware\arduino\avr\cores\arduino/Print.h:49:12: note:   no known conversion for argument 1 from 'unsigned char ' to 'const char*'
call of overloaded 'write(unsigned char )' is ambiguous

报告将会包含更多的信息
"在编译时,输出详细信息"
在 文件>首选项 中启用
页: [1]
查看完整版本: Arduino2560 与语音芯片Syn6628语音播放程序问题,附有程序