语音合成器与水流测量仪项目全解析
立即解锁
发布时间: 2025-08-13 01:56:10 阅读量: 21 订阅数: 40 

### 语音合成器与水流测量仪项目全解析
#### 语音合成器部分
当你为 Arduino 和语音合成器盾牌通电时,即使还未向 SpeakJet 发送任何值,它也会立即说出“ready”。这其实是 SpeakJet 的内部自检,表明自检完成且已准备好接收命令。
##### SpeakJet 命令与音素
SpeakJet 接受 0 到 255 的单字节值,部分值被视为命令,其他则作为音素用于发声。低数值用于发送命令,具体命令如下表所示:
| Byte | Command |
| --- | --- |
| 0 | Pause 0 (0ms) |
| 1 | Pause 1 (100ms) |
| 2 | Pause 2 (200ms) |
| 3 | Pause 3 (700ms) |
| 4 | Pause 4 (30ms) |
| 5 | Pause 5 (60ms) |
| 6 | Pause 6 (90ms) |
| 7 | Play next sound fast |
| 8 | Play next sound slow |
| 14 | Stress next phoneme |
| 15 | Relax next phoneme |
| 20 | Volume X (range 0–127, default 96) |
| 21 | Speed X (range 0–127, default 114) |
| 22 | Pitch X (range 0–255, default 88) |
| 23 | Bend X (range 0–15, default 5) |
| 30 | Delay X (range 0–255 times 10ms increments) |
其中,有五个命令是双字节命令。第一个字节是命令本身,第二个 X 字节是该参数的值。例如,发送 20 和 56 这一对字节,会将音量设置为 56。
数值 128 及以上是音素本身,用于构成单词的发音。128 到 199 的值代表了各种音素,以下是部分音素的示例:
| Byte | Phoneme | Sample Words | Duration | Type |
| --- | --- | --- | --- | --- |
| 128 | IY | Feed, See, Even | 70 | Voiced Long Vowel |
| 129 | IH | Sit, Fix, Pin | 70 | Voiced Short Vowel |
| 130 | EY | Hair, Gate, Beige | 70 | Voiced Long Vowel |
| 131 | EH | Met, Check, Red | 70 | Voiced Short Vowel |
| 132 | AY | Hat, Fast, Fan | 70 | Voiced Short Vowel |
数值 200 及以上用于特殊用途的声音,如音效和 DTMF 音调,示例如下:
| Byte | Phoneme | Sample Words | Duration | Type |
| --- | --- | --- | --- | --- |
| 200 | R0 | Robot | 80 | - |
| 201 | R1 | Robot | 80 | - |
| 202 | R2 | Robot | 80 | - |
| 203 | R3 | Robot | 80 | - |
| 204 | R4 | Robot | 80 | - |
##### 创建自定义消息
使用音素创建易于理解的单词是一个繁琐的过程。即使是一个简短的句子,如果要逐个读出每个单词,也需要花费不少时间。为节省时间,Practical Arduino 网站上的语音合成器项目页面提供了一个包含近 2000 个单词及其等效音素的文件链接。你只需在列表中查找所需的单词,然后将相关代码复制到软件中即可。
##### 读取 SpeakJet 状态
SpeakJet 有一个 64 字节的小输入缓冲区,因此不需要太多命令就会填满它。输入缓冲区存储一系列音素,每个音素代表一个单词内的声音或单词之间的停顿。虽然音素数量因单词而异,但大致与单词中的字母数量相似。不过,像改变音高、音量和速率等命令会在缓冲区中占用两个字节:一个用于指示参数,另一个用于指示值。
由于缓冲区空间有限,一个简单的句子很容易填满缓冲区,导致句子结尾被截断。一种简单的解决方法是将几个值作为一个块一起发送,然后在发送下一个块之前插入一个延迟。但这种方法存在风险,如果延迟过长,你会听到 SpeakJet 在等待下一批音素时出现停顿;如果延迟过短,文本会因缓冲区溢出而被截断。
通过将 SpeakJet 的状态引脚连接到 Arduino 的数字输入,可以让软件自动检测 SpeakJet 是否准备好接收更多数据,然后以合适的速率向其发送命令,避免缓冲区溢出。SpeakJet 状态引脚与 Arduino 输入的连接如下表所示:
| SpeakJet Pin | Name | Function | Arduino Pin |
| --- | --- | --- | --- |
| 17 | D0 | Ready | Digital I/O 6 |
| 16 | D1 | Speaking | Digital I/O 5 |
状态引脚连接到 Arduino 的流程如下:
1. 准备三个 1K 电阻。
2. 将 SpeakJet 的 D0 引脚通过 1K 电阻连接到 Arduino 的数字 I/O 6 引脚。
3. 将 SpeakJet 的 D1 引脚通过 1K 电阻连接到 Arduino 的数字 I/O 5 引脚。
4. 确保连接牢固,避免短路。
通过 Arduino 读取数字引脚 4、5 和 6,就可以检查 SpeakJet 是否准备好接受更多值。如果引脚 6(Ready)为高电平,说明 SpeakJet 已通过内部自检并准备好接收值;引脚 5 仅在实际发声时为高电平,发声结束后立即变为低电平;引脚 4 是关键引脚,当输入缓冲区超过一半满时,该引脚会变为高电平,指示主机暂时停止发送值。当引脚 4 再次变为低电平时,就知道 SpeakJet 的缓冲区有足够空间接
0
0
复制全文
相关推荐










