Ce projet démontre la synthèse de la parole sur l'ESP32. Il effectue la synthèse localement à l'aide de la bibliothèque CMU Flite, plutôt que de décharger cette tâche aux fournisseurs de cloud.
Pour ce projet, Flite 2.2 (Commit Hash E9880474) a été porté vers ESP-IDF 3.2.2 Framework et est maintenant un ensemble de composants réutilisables qui peuvent être trouvés dans le répertoire "Composants".
La voix cmu_us_kal est fournie à titre d'exemple. D'autres voix prédéfinies qui viennent avec Flite sont trop grandes pour s'intégrer dans le flash. De nouvelles voix pourraient être ajoutées en tant que composants distincts à condition qu'ils s'intègrent dans Flash.
L'exemple exécute un serveur HTTP simple qui reçoit des demandes de texte à synthétiser. Le programme synthétise le texte et envoie les données PCM via I2S. Du côté de la réception I2S, j'ai utilisé la puce PCM5102, mais toute autre puce pourrait fonctionner. De plus, il pourrait être possible d'acheminer les I2 vers un DAC interne 8 bits ESP32.
Tout d'abord, configurez en utilisant make menuconfig . Vous devez définir votre Wi-Fi SSID et votre mot de passe ainsi que les épingles à utiliser pour I2S. J'ai testé avec BCK = 26, WS = 25 et Data = 22.
Étant donné que le fichier WAV produit est stocké en tant que tableau de valeurs PCM alloué sur le tas, suffisamment d'espace de tas doit être disponible. L'espace requis dépend de la longueur du texte synthétisé. Par conséquent, l'utilisation du modèle WORVER de ESP32 dont 4 Mo de Psaram est conseillé. Le PSRAM doit être activé dans Menuconfig. Il est un peu caché dans les menus: Configation du composant -> ESP32 Spécifique -> Prise en charge de la configuration externe, SPI Connected RAM -> SPI RAM Config. Une fois activé, il a ajouté BRE au pool d'allocation de tas.
Pour envoyer le texte pour ESP32 à synthétiser, il faut envoyer une demande de GET HTTP de /say avec un paramètre de requête s . Cela peut être fait avec un parcours Web. Parcourez http://<ip of esp device>/say?s=This is an example text . La chaîne de requête est limitée à environ 256 caractères, mais il s'agit d'une limitation artificielle de l'exemple de programme et la bibliothèque Flite peut synthétiser des textes beaucoup plus longs à la fois.
Les données synthétisées sont diffusées en morceaux, ainsi la lecture peut commencer avant le traitement fini par le flux de tout le texte. Cela réduit le retard des textes plus longs et donne une sensation en temps réel. C'est l'un des avantages de l'utilisation de Flite plutôt que d'utiliser des services cloud et de télécharger les données synthétisées via le Wi-Fi.
Copiez les composants dans votre projet.
Assurez-vous que votre application Partiton a au moins 2 Mo.
factory, app, factory, 0x10000, 0x2F0000,
Configurez avec make menuconfig .
Utilisez ensuite le code suivant:
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);
Si vous avez utilisé Flite dans votre projet, ouvrez une demande de traction avec un lien vers le projet et je l'ajouterai ici.