Этот проект демонстрирует синтез речи на ESP32. Он выполняет синтез локально, используя библиотеку Flite CMU, а не разгружая эту задачу на облачных поставщиков.
Для этого проекта Flite 2.2 (Commit hash e9880474) был перенесен в структуру ESP-IDF 3.2.2 и теперь является набором многократных компонентов, которые можно найти в каталоге «Компоненты».
Голос cmu_us_kal предоставляется в качестве примера. Другие предопределенные голоса, которые поставляются с Flite, слишком велики, чтобы вписаться в вспышку. Новые голоса могут быть добавлены в качестве отдельных компонентов, при условии, что они вписываются в Flash.
В примере запускается простой HTTP -сервер, который получает запросы текста, которые будут синтезированы. Программа синтезирует текст и отправляет данные PCM по I2S. На обратной стороне I2 я использовал чип PCM5102, но любой другой чип может работать. Кроме того, можно было бы быть возможным для I2s на внутренний 8 -битный DAC ESP32.
Во -первых, настройте использование make menuconfig . Вам нужно установить свой Wi-Fi SSID и пароль, а также выводы для i2s. Я проверил с BCK = 26, WS = 25 и DATA = 22.
Поскольку созданный файл WAV сохраняется в виде массива значений PCM, выделенных на кучу, должно быть достаточно места кучи. Требуемое пространство зависит от длины синтезированного текста. Поэтому рекомендуется использовать модель Wrover ESP32, которая имеет 4 МБ псарама. PSRAM должен быть включен в MenuConfig. Он немного скрыт в меню: Component Config -> ESP32 Specific -> Поддержка внешней, подключенной к SPI -> SPI RAM Config. После включения он добавит в пул распределения кучи.
Чтобы отправить текст для ESP32, чтобы синтезировать, необходимо отправить http get запрос на /say , с параметрами запроса s . Это можно сделать с помощью веб -просмотра. Зайдите на http://<ip of esp device>/say?s=This is an example text . Строка запроса ограничена приблизительно 256 символами, но это искусственное ограничение программы примера, и библиотека Flite может синтезировать гораздо более длинные тексты одновременно.
Синтезированные данные транслируются в кусочках, поэтому воспроизведение может начаться до того, как Flite готовая обработка всего текста. Это уменьшает задержку для более длинных текстов и дает реальное чувство. Это одно из преимуществ использования FLITE, а не использования облачных сервисов и загрузки синтезированных данных через Wi-Fi.
Скопируйте компоненты в свой проект.
Убедитесь, что ваше приложение Partiton имеет не менее 2 МБ.
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 в своем проекте, откройте запрос на притяжение по ссылке на проект, и я добавлю его здесь.