Este proyecto demuestra la síntesis del habla en el ESP32. Realiza la síntesis localmente utilizando la biblioteca CMU Flite, en lugar de descargar esta tarea a los proveedores de nubes.
Para este proyecto, Flite 2.2 (Conjunto Hash E9880474) se portó al marco ESP-IDF 3.2.2 y ahora es un conjunto de componentes reutilizables que se pueden encontrar en el directorio "Componentes".
La voz cmu_us_kal se proporciona como ejemplo. Otras voces predefinidas que vienen con flita son demasiado grandes para encajar en el flash. Se podrían agregar nuevas voces como componentes separados siempre que se ajusten a Flash.
El ejemplo ejecuta un servidor HTTP simple que recibe las solicitudes de texto GET para sintetizar. El programa sintetiza el texto y envía los datos de PCM a través de i2s. En el lado de recepción de I2S usé el chip PCM5102, pero cualquier otro chip podría funcionar. Además, podría ser posible enrutar I2 a un DAC interno de 8 bits ESP32.
Primero, configure usando make menuconfig . Debe establecer su SSID y contraseña Wi-Fi, así como los pines para usar para I2. Probé con BCK = 26, WS = 25 y datos = 22.
Dado que el archivo WAV producido se almacena como una matriz de valores de PCM asignados en el montón, debe estar disponible suficiente espacio de montón. El espacio requerido depende de la longitud del texto sintetizado. Por lo tanto, se recomienda usar el modelo de ESP32 que tiene 4 MB de Psaram. El PSRAM debe estar habilitado en Menuconfig. Está un poco oculto en los menús: configuración de componentes -> ESP32 específico -> soporte para RAM -SPI SPI SPI Configuración SPI RAM. Una vez habilitado, BRE se agregará al grupo de asignación de montón.
Para enviar el texto para ESP32 para sintetizar, uno necesita enviar una solicitud HTTP GET de /say Path con un parámetro de consulta s . Esto se puede hacer con una navegación web. Explore a http://<ip of esp device>/say?s=This is an example text . La cadena de consulta se limita a aproximadamente 256 caracteres, pero esta es una limitación artificial del programa de ejemplo y la biblioteca de flite puede sintetizar textos mucho más largos a la vez.
Los datos sintetizados se transmiten en fragmentos, por lo que la reproducción puede comenzar antes de que Flite termine de procesar todo el texto. Esto reduce el retraso para textos más largos y da una sensación en tiempo real. Esta es una de las ventajas de usar flita en lugar de usar servicios en la nube y descargar los datos sintetizados a través de Wi-Fi.
Copie los componentes en su proyecto.
Asegúrese de que su aplicación Partiton tenga al menos 2 MB.
factory, app, factory, 0x10000, 0x2F0000,
Configurar con make menuconfig .
Luego use el siguiente código:
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);
Si ha usado Flite en su proyecto, abra una solicitud de extracción con un enlace al proyecto y lo agregaré aquí.