该项目展示了ESP32上的语音综合。它使用CMU FLITE库在本地执行合成,而不是将此任务卸载到云提供商。
对于此项目,FLITE 2.2(提交Hash E9880474)已移植到ESP-IDF 3.2.2框架,现在是一组可重复使用的组件,可以在“组件”目录中找到。
提供了cmu_us_kal语音作为示例。 Flite随附的其他预定义声音太大,无法适应闪光灯。只要它们适合闪光灯,就可以添加新的声音作为单独的组件。
该示例运行了一个简单的HTTP服务器,该服务器接收到要合成的文本请求。该程序综合了文本,并通过i2s发送PCM数据。在I2接收方中,我使用了PCM5102芯片,但任何其他芯片都可能起作用。另外,可以将I2路由到ESP32内部8位DAC。
首先,使用make menuconfig配置。您需要设置Wi-Fi SSID和密码以及用于I2S的引脚。我用BCK = 26,WS = 25和数据= 22进行了测试。
由于生产的WAV文件被存储为分配在堆上的PCM值数组,因此必须提供足够的堆空间。所需的空间取决于综合文本的长度。因此,建议使用具有4MB PSARAM的ESP32的旋转模型。必须在menuconfig中启用PSRAM。它在菜单中有点隐藏:组件配置 - > ESP32特定 - >支持外部,SPI连接的RAM-> SPI RAM配置。启用后,它将添加到堆分配池中。
要将ESP32的文本发送到合成,需要发送http获取/say路径的HTTP参数s 。这可以通过网络浏览来完成。浏览到http://<ip of esp device>/say?s=This is an example text 。查询字符串仅限于大约256个字符,但这是示例程序的人为限制,Flite库可以一次合成更长的文本。
合成的数据是在块中流的,因此可以在FLITE完成所有文本之前开始播放。这减少了更长的文本的延迟,并给人以实时的感觉。这是使用FLITE而不是使用云服务并通过Wi-Fi下载综合数据的优点之一。
将组件复制到您的项目中。
确保您的应用程序Partiton至少具有2MB。
factory, app, factory, 0x10000, 0x2F0000,
用make menuconfig配置。
然后使用以下代码:
cst_voice *register_cmu_us_kal(const char *voxdir);
int i2s_stream_chunk(const cst_wave *w, int start, int size,
int last, cst_audio_streaming_info *asi)
{
// write here code that processes the wav chunk. For example send it to
// I2S, drive a DAC or send it via Wi-Fi/Bluetooth/Serial to another
// device.
}
...
/* Initialization code */
flite_init();
cst_voice *v = register_cmu_us_kal(NULL);
cst_audio_streaming_info *asi =
cst_alloc(struct cst_audio_streaming_info_struct,1);
asi->min_buffsize = 256;
asi->asc = i2s_stream_chunk;
asi->userdata = NULL;
feat_set(v->features,"streaming_info",audio_streaming_info_val(asi));
/* Synthesis Code */
cst_wave * wav = flite_text_to_wave("Replace with your text",v);
delete_wave(wav);
如果您在项目中使用了FLITE,请打开带有指向该项目的链接的拉请请求,我将在此处添加。