【ESP32-Korvo测评】四:文字转语音TTS
[复制链接]
本帖最后由 数码小叶 于 2021-2-7 22:06 编辑
上一篇已将安装好了智能语音助手ESP-Skainet,这次来实际体验一个应用就是文字转语音,为了测试这个,从网上买了两个喇叭,用其中一个4Ω 2W的来测试,之前分析过原理图,最高可以带载4W的喇叭。
要进行文字转语音,首先要有一个预定义的声音集,乐鑫提供里两种方式,一种是用户程序里调用预定义的语音库,一种是从特定的语音分区里调用初始化,乐鑫推荐使用第二种,因为第一种可能是app bin的大小超过ESP32的限制。
采用第二种方法,要先把音频文件单独烧写进去
在TTS例程中,用到了自定义分区表,在CSV文件中,有这么一行
voice_data, data, fat, 0x100000, 3M
CSV是ESP32的分区表文件,ESP32 在 flash 的 默认偏移地址 0x8000 处烧写一张分区表。该分区表的长度为 0xC00 字节(最多可以保存 95 条分区表条目)。分区表数据后还保存着该表的 MD5 校验和,用于验证分区表的完整性。此外,如果芯片使能了 安全启动 功能,则该分区表后还会保存签名信息。分区表中的每个条目都包括以下几个部分:Name(标签)、Type(app、data 等)、SubType 以及在 flash 中的偏移量(分区的加载地址)。
从idf.py menuconfig里可以看到,ESP32有三种分区表可以选择,两种系统定义好的,一种自定义的,预先定义好的两个差别是是否包含OTA分区,产品应用的OTA肯定必不可少,但是平时测试,没必要包含OTA了
分区表中的SubType内容与具体Type有关,目前,esp-idf 仅仅规定了 “app” 和 “data” 两种子类型。当 Type 定义为 app 时,SubType 字段可以指定为 factory (0),ota_0 (0x10) … ota_15 (0x1F) 或者 test (0x20)。当 Type 定义为 data 时,SubType 字段可以指定为 ota (0),phy (1),nvs (2) 或者 nvs_keys (4)。其它数据子类型已预留给 esp-idf 未来使用。所以从文档里找不到这里用到的子类fat,于是只能从程序里倒推,打开esp_partition.h文件,可以找到fat的定义
这个音频文件比较大,有2.8MB,但是烧写速度还是比较快的,不是直接在ESP-IDF中烧录,跳转到git bash中烧录
编译完工程,给板子接上喇叭
语音文件烧写完成后,还需要烧写程序文件
程序烧写完成后就会听到“欢迎使用乐鑫语音合成”
随后就可以通过串口,往板子里输入汉字或者英文字符
可以连续输入,识别转化很快,就是有一点,汉字是连续发音的,英文字符是单个发音的,然后还有一点不完美的地方,就是这个音量很小,那当然是要调节一下了,在MediaHal.h找到了相关的操作函数,MediaHalSetVolume(int volume);最后测试,70的音量大小对于我接的这个喇叭听着刚刚好,那后面就都设置为70了。MediaHalSetVolume(70)。
一步步的体验学习过来,中间解决的bug越多,越能感受到ESP32-Korvo这块板子带来的吸引力
|