Les microcontrôleurs n'ont pas suffisamment de ressources pour fournir une fonctionnalité de texte de haute qualité à la parole. Cependant, il peut souvent être assez bon de fournir une solution qui est basée sur un audio pré-enregistré.
Je me demandais les limites de cette approche et j'ai décidé de mettre en œuvre une petite bibliothèque Arduino prototype basée sur les outils audio Arduino pour la sortie audio.
Pour garder les choses simples, j'ai commencé avec une simple implémentation qui peut traiter les numéros et en plus de celle d'un autre qui lit le temps. Le point de départ est donc quelques classes qui traduisent les nombres en texte. Le texte est ensuite utilisé pour identifier les fichiers audio pré-enregistrés.
Cette fonctionnalité peut être utilisée, par exemple pour créer certains
NumberTotext traduit l'entrée de numéro dans un vecteur audio_tools :: des mots. Dans les exemples suivants, nous les imprimons:
NumberToText ntt;
auto result = ntt.say( 700123.431 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Le résultat est: sept cent mille cent vingt-trois points quatre trois un zéro zéro zéro
Pour traiter le temps dont vous avez besoin pour fournir les heures et les minutes en entrée.
TimeToText ttt;
auto result = ttt.say( 12 , 00 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Le résultat est: midi
Vous pouvez également traiter les numéros avec les unités correspondantes
NumberUnitToText utt;
auto result = utt.say( 1.01 , " usd " );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Le résultat est: un dollar américain et un cent
Si nous enregistrons les mots dans MP3, nous pourrions même nous en sortir avec la nécessité d'un lecteur SD séparé car nous pouvons stocker l'audio dans la mémoire du programme. Les valeurs d'exampleaudictionaryary contient les fichiers MP3 préenregistrés qui sont stockés dans le progmem.
# include " SimpleTTS.h "
# include " AudioTools/AudioCodecs/CodecMP3Helix.h "
I2SStream i2s; // audio output via I2S
MP3DecoderHelix mp3; // mp3 decoder
AudioDictionary dictionary (ExampleAudioDictionaryValues);
TextToSpeech tts (i2s, mp3, dictionary);
void setup (){
Serial. begin ( 115200 );
// setup i2s
auto cfg = i2s. defaultConfig ();
cfg. sample_rate = 24000 ;
cfg. channels = 1 ;
i2s. begin (cfg);
tts. say ( " BILLION " );
}
void loop () {
}
Le mot "milliard" est prononcé via les I2.
Vous pouvez également utiliser les classes de génération de texte décrites ci-dessus:
# include " SimpleTTS.h "
# include " AudioTools/AudioCodecs/CodecMP3Helix.h "
TimeToText ttt; // Text source
I2SStream i2s; // audio output via I2S
MP3DecoderHelix mp3; // mp3 decoder
AudioDictionary dictionary (ExampleAudioDictionaryValues);
TextToSpeech tts (ttt, i2s, mp3, dictionary);
void setup (){
Serial. begin ( 115200 );
// setup i2s
auto cfg = i2s. defaultConfig ();
cfg. sample_rate = 24000 ;
cfg. channels = 1 ;
i2s. begin (cfg);
ttt. say ( 14 , 40 );
}
void loop () {
}
Cela sortira le résultat audio via I2S.
Voici les informations pour un croquis qui fournit une prise en charge de temps et des numéros de discussion et stocke tous les fichiers audio sous forme de MP3 dans progmem sur ESP32:
Sketch uses 740438 bytes (23%) of program storage space. Maximum is 3145728 bytes.
Global variables use 23632 bytes (7%) of dynamic memory, leaving 304048 bytes for
Je pense que cela laisse beaucoup de marge et vous avez toujours la possibilité de stocker l' audio sur un lecteur SD ...
Voici le lien vers la documentation de classe générée. De plus amples informations peuvent être trouvées dans le wiki et dans mes blogs