Proyek ini menunjukkan sintesis bicara tentang ESP32. Ini melakukan sintesis secara lokal menggunakan CMU Flite Library, daripada membongkar tugas ini ke penyedia cloud.
Untuk proyek ini, Flite 2.2 (komit hash e9880474) diangkut ke kerangka kerja ESP-IDF 3.2.2 dan sekarang merupakan satu set komponen yang dapat digunakan kembali yang dapat ditemukan di direktori "komponen".
Suara cmu_us_kal disediakan sebagai contoh. Suara -suara yang telah ditentukan sebelumnya yang datang dengan api terlalu besar untuk masuk ke dalam flash. Suara -suara baru dapat ditambahkan sebagai komponen terpisah asalkan mereka cocok dengan flash.
Contoh ini menjalankan server HTTP sederhana yang menerima permintaan mendapatkan teks yang akan disintesis. Program ini mensintesis teks dan mengirimkan data PCM ke I2S. Di sisi penerima I2S saya menggunakan chip PCM5102, tetapi chip lain mungkin berfungsi. Selain itu, mungkin untuk Rute I2 ke DAC 8 bit internal ESP32.
Pertama, konfigurasikan menggunakan make menuconfig . Anda perlu mengatur SSID dan kata sandi Wi-Fi Anda serta pin yang akan digunakan untuk I2S. Saya diuji dengan bck = 26, WS = 25 dan data = 22.
Karena file WAV yang diproduksi disimpan sebagai array nilai PCM yang dialokasikan pada tumpukan, ruang tumpukan yang cukup harus tersedia. Ruang yang dibutuhkan tergantung pada panjang teks yang disintesis. Oleh karena itu menggunakan model Wrover ESP32 yang memiliki 4MB PSARAM disarankan. PSRAM harus diaktifkan di Menuconfig. Sedikit tersembunyi di menu: komponen config -> spesifik ESP32 -> dukungan untuk eksternal, RAM terhubung SPI -> konfigurasi RAM SPI. Setelah diaktifkan, itu akan ditambahkan ke kolam alokasi heap.
Untuk mengirim teks untuk ESP32 untuk disintesis, orang perlu mengirim HTTP Get Request of /say Path dengan parameter kueri s . Ini bisa dilakukan dengan penjelajahan web. Jelajahi ke http://<ip of esp device>/say?s=This is an example text . String kueri terbatas pada sekitar 256 karakter, tetapi ini adalah batasan buatan dari contoh program dan perpustakaan Flite dapat mensintesis teks yang lebih lama sekaligus.
Data yang disintesis dialirkan dalam potongan, sehingga pemutaran dapat dimulai sebelum flite selesai memproses semua teks. Ini mengurangi keterlambatan untuk teks yang lebih lama dan memberikan nuansa waktu nyata. Ini adalah salah satu keuntungan menggunakan flite daripada menggunakan layanan cloud dan mengunduh data yang disintesis melalui Wi-Fi.
Salin komponen ke dalam proyek Anda.
Pastikan aplikasi aplikasi Anda memiliki setidaknya 2MB.
factory, app, factory, 0x10000, 0x2F0000,
Konfigurasikan dengan make menuconfig .
Kemudian gunakan kode berikut:
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);
Jika Anda menggunakan Flite di proyek Anda, buka permintaan tarik dengan tautan ke proyek dan saya akan menambahkannya di sini.