يوضح هذا المشروع تخليق الكلام على ESP32. إنه يؤدي التوليف محليًا باستخدام مكتبة CMU Flite ، بدلاً من إلغاء تحميل هذه المهمة لمقدمي الخدمات السحابية.
بالنسبة لهذا المشروع ، تم نقل Flite 2.2 (الالتزام Hash E9880474) بإطار ESP-IDF 3.2.2 وهو الآن مجموعة من المكونات القابلة لإعادة الاستخدام التي يمكن العثور عليها في دليل "المكونات".
يتم توفير صوت cmu_us_kal كمثال. أصوات أخرى محددة مسبقًا تأتي مع Flite أكبر من أن تتناسب مع الفلاش. يمكن إضافة أصوات جديدة كمكونات منفصلة شريطة أن تتناسب مع Flash.
يقوم المثال بتشغيل خادم HTTP بسيط يستقبل الحصول على طلبات من النص لتوليفها. يقوم البرنامج بتجميع النص ويرسل بيانات PCM عبر I2S. على جانب استلام I2S ، استخدمت PCM5102 Chip ، ولكن قد تعمل أي شريحة أخرى. بالإضافة إلى ذلك ، قد يكون من الممكن توجيه I2S إلى DAC INTER INTERNAL 8 بت.
أولاً ، تكوين باستخدام make menuconfig . تحتاج إلى تعيين Wi-Fi SSID وكلمة المرور وكذلك المسامير لاستخدامها في I2S. لقد اختبرت مع BCK = 26 ، WS = 25 والبيانات = 22.
نظرًا لأن ملف WAV المنتجة يتم تخزينه كمجموعة من قيم PCM المخصصة على الكومة ، يجب أن تتوفر مساحة كافية في الكومة. يعتمد المساحة المطلوبة على طول النص المركب. لذلك باستخدام نموذج Wrover من ESP32 الذي يحتوي على 4 ميغابايت من psaram ينصح. يجب تمكين PSRAM في menuconfig. إنه مخفي قليلاً في القوائم: Component Config -> ESP32 محدد -> دعم لـ SPI Connected RAM -> SPI RAM. بمجرد تمكينه ، سيتم إضافة BRE إلى تجمع تخصيص الكومة.
لإرسال النص لـ ESP32 لتوليفه ، يحتاج المرء إلى إرسال طلب /say the path مع 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 في مشروعك ، فتح طلب سحب مع رابط للمشروع وسأضيفه هنا.