Dieses Projekt zeigt die Sprachsynthese zum ESP32. Es führt die Synthese lokal mithilfe der CMU Flite -Bibliothek durch, anstatt diese Aufgabe an Cloud -Anbieter zu übertragen.
Für dieses Projekt wurde Flite 2.2 (Commit Hash E9880474) auf ESP-IDF 3.2.2 Framework portiert und ist jetzt eine Reihe wiederverwendbarer Komponenten, die im Verzeichnis "Komponenten" zu finden sind.
Die Voice cmu_us_kal wird als Beispiel bereitgestellt. Andere vordefinierte Stimmen, die mit Flite geliefert werden, sind zu groß, um in den Blitz zu passen. Neue Stimmen könnten als separate Komponenten hinzugefügt werden, sofern sie in Flash passen.
In dem Beispiel wird ein einfacher HTTP -Server ausgeführt, auf dem GET -Anforderungen von Text synthetisiert werden. Das Programm synthetisiert den Text und sendet die PCM -Daten über i2s. Auf der I2S -Empfangsseite habe ich PCM5102 -Chip verwendet, aber jeder andere Chip kann funktionieren. Zusätzlich könnte es möglich sein, I2S zu einem ESP32 Internal 8 -Bit DAC zu übertragen.
Konfigurieren Sie zunächst mithilfe von make menuconfig . Sie müssen Ihr Wi-Fi-SSID und Ihr Passwort sowie die Pins für i2s festlegen. Ich habe mit BCK = 26, WS = 25 und Data = 22 getestet.
Da die erzeugte WAV -Datei als Array von PCM -Werten auf dem Haufen gespeichert wird, muss genügend Haufen Platz verfügbar sein. Der erforderliche Raum hängt von der Länge des synthetisierten Textes ab. Daher wird die Verwendung von Wrover -Modell von ESP32 mit 4 MB PSARAM empfohlen. Das PSRAM muss in Menuconfig aktiviert werden. Es ist in den Menüs ein wenig versteckt: Komponentenkonfiguration -> ESP32 Spezifisch -> Unterstützung für externe, SPI -angeschlossene RAM -> SPI -RAM -Konfiguration. Sobald es aktiviert ist, wird BRE zum Heap -Allokationspool hinzugefügt.
Um den Text für ESP32 zu senden, um zu synthetisieren, muss man eine HTTP -GET -Anforderung von /say -Pfad mit einem s senden. Dies kann mit einem Web -Stöbern erfolgen. Durchsuchen Sie http://<ip of esp device>/say?s=This is an example text . Die Abfragezeichenfolge ist auf ungefähr 256 Zeichen beschränkt. Dies ist jedoch eine künstliche Einschränkung des Beispielprogramms, und die Flite -Bibliothek kann auf einmal viel längere Texte synthetisieren.
Die synthetisierten Daten werden in Stücken gestreamt, sodass die Wiedergabe beginnen kann, bevor die Flite -Verarbeitung den gesamten Text beendet ist. Dies reduziert die Verzögerung für längere Texte und verleiht ein Echtzeitgefühl. Dies ist einer der Vorteile der Verwendung von Flite, anstatt Cloud-Dienste zu verwenden und die synthetisierten Daten über Wi-Fi herunterzuladen.
Kopieren Sie die Komponenten in Ihr Projekt.
Stellen Sie sicher, dass Ihre App Partiton mindestens 2 MB hat.
factory, app, factory, 0x10000, 0x2F0000,
Konfigurieren Sie mit make menuconfig .
Verwenden Sie dann den folgenden Code:
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);
Wenn Sie Flite in Ihrem Projekt verwendet haben, öffnen Sie eine Pull -Anfrage mit einem Link zum Projekt und ich werde es hier hinzufügen.