โครงการนี้แสดงให้เห็นถึงการสังเคราะห์คำพูดบน ESP32 มันดำเนินการสังเคราะห์ในเครื่องโดยใช้ไลบรารี CMU Flite แทนที่จะถ่ายโอนงานนี้ให้กับผู้ให้บริการคลาวด์
สำหรับโครงการนี้ Flite 2.2 (commit Hash E9880474) ถูกส่งไปยัง Framework ESP-IDF 3.2.2 และตอนนี้เป็นชุดของส่วนประกอบที่สามารถนำกลับมาใช้ใหม่ได้ซึ่งสามารถพบได้ในไดเรกทอรี "Components"
เสียง cmu_us_kal มีให้เป็นตัวอย่าง เสียงที่กำหนดไว้ล่วงหน้าอื่น ๆ ที่มาพร้อมกับ Flite นั้นใหญ่เกินไปที่จะพอดีกับแฟลช สามารถเพิ่มเสียงใหม่เป็นส่วนประกอบที่แยกต่างหากโดยที่พวกเขาพอดีกับแฟลช
ตัวอย่างเรียกใช้เซิร์ฟเวอร์ HTTP อย่างง่ายที่ได้รับการร้องขอข้อความที่จะสังเคราะห์ โปรแกรมสังเคราะห์ข้อความและส่งข้อมูล PCM ผ่าน I2S ในด้านการรับ I2S ฉันใช้ชิป PCM5102 แต่ชิปอื่น ๆ อาจใช้งานได้ นอกจากนี้อาจเป็นไปได้ที่จะกำหนดเส้นทาง I2S ไปยัง DAC 8 บิตภายใน ESP32
ขั้นแรกให้กำหนดค่าโดยใช้ make menuconfig คุณต้องตั้งค่า Wi-Fi SSID และรหัสผ่านรวมถึงพินเพื่อใช้สำหรับ I2S ฉันทดสอบกับ BCK = 26, WS = 25 และข้อมูล = 22
เนื่องจากไฟล์ WAV ที่ผลิตจะถูกเก็บไว้เป็นอาร์เรย์ของค่า PCM ที่จัดสรรไว้บนกองจึงต้องมีพื้นที่ฮีปเพียงพอ พื้นที่ที่ต้องการขึ้นอยู่กับความยาวของข้อความสังเคราะห์ ดังนั้นควรใช้แบบจำลองการเรียกร้องของ ESP32 ที่มี 4MB ของ Psaram PSRAM จะต้องเปิดใช้งานใน menuconfig มันซ่อนอยู่เล็กน้อยในเมนู: การกำหนดค่าส่วนประกอบ -> ESP32 เฉพาะ -> สนับสนุนสำหรับ RAM ที่เชื่อมต่อกับ SPI ภายนอก -> SPI RAM config เมื่อเปิดใช้งานแล้วจะเพิ่ม Bre ลงในกลุ่มการจัดสรรกอง
ในการส่งข้อความสำหรับ ESP32 เพื่อสังเคราะห์เราจำเป็นต้องส่ง HTTP GET Request of /say Path ด้วย s แบบสอบถาม สามารถทำได้ด้วยการเรียกดูเว็บ เรียกดู http://<ip of esp device>/say?s=This is an example text สตริงแบบสอบถามถูก จำกัด ไว้ที่ประมาณ 256 อักขระ แต่นี่เป็นข้อ จำกัด เทียมของโปรแกรมตัวอย่างและไลบรารี Flite สามารถสังเคราะห์ข้อความที่ยาวขึ้นได้ในครั้งเดียว
ข้อมูลสังเคราะห์ถูกสตรีมเป็นชิ้นดังนั้นการเล่นสามารถเริ่มต้นได้ก่อนที่ Flite จะประมวลผลข้อความทั้งหมด สิ่งนี้จะช่วยลดความล่าช้าสำหรับข้อความที่ยาวขึ้นและให้ความรู้สึกแบบเรียลไทม์ นี่เป็นหนึ่งในข้อดีของการใช้ flite แทนที่จะใช้บริการคลาวด์และดาวน์โหลดข้อมูลสังเคราะห์ผ่าน Wi-Fi
คัดลอกส่วนประกอบลงในโครงการของคุณ
ตรวจสอบให้แน่ใจว่าแอพพาร์ทตันของคุณมีอย่างน้อย 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 ในโครงการของคุณให้เปิดคำขอดึงพร้อมลิงค์ไปยังโครงการและฉันจะเพิ่มที่นี่