該項目展示了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,請打開帶有指向該項目的鏈接的拉請請求,我將在此處添加。