Los microcontroladores no tienen suficientes recursos para proporcionar una funcionalidad de "texto al habla" de alta calidad. Sin embargo, a menudo puede ser lo suficientemente bueno como para proporcionar una solución que se basa en algún audio pregrabado.
Me preguntaba sobre las limitaciones de este enfoque y decidí implementar una pequeña biblioteca de prototipo Arduino que se basa en las herramientas de audio Arduino para la salida de audio.
Para mantener las cosas simples, comencé con una implementación simple que puede procesar números y además de otro que lee el tiempo. Entonces, el punto de partida son algunas clases que traducen los números al texto. Luego se usa el texto para identificar los archivos de audio pregrabados.
Esta funcionalidad se puede usar, por ejemplo, para construir algunos
NumberTotExt traduce la entrada de números en un Audio_Tools :: Vector de las palabras. En los siguientes ejemplos los imprimimos:
NumberToText ntt;
auto result = ntt.say( 700123.431 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
El resultado es: setecientos mil cientos y veintiséis puntos cuatro tres un cero cero cero
Para procesar el tiempo, debe proporcionar las horas y los minuts como entrada.
TimeToText ttt;
auto result = ttt.say( 12 , 00 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
El resultado es: mediodía
También puede procesar números con las unidades correspondientes
NumberUnitToText utt;
auto result = utt.say( 1.01 , " usd " );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
El resultado es: un dólar estadounidense y un centavo
Si grabamos las palabras en MP3, incluso podríamos escapar con la necesidad de una unidad SD separada porque podemos almacenar el audio en la memoria del programa. EjempleAudiodictionaryValues contiene los archivos MP3 pregrabados que se almacenan en el 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 () {
}
La palabra "mil millones" se pronuncia a través de i2s.
También puede usar las clases de generación de texto descritas anteriormente:
# 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 () {
}
Esto generará el resultado de audio a través de i2s.
Aquí está la información para un boceto que proporciona tiempo de conversación y soporte de números y almacena todos los archivos de audio como mp3 en progmem en 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
Creo que esto deja mucho espacio para la cabeza y todavía tienes la opción de almacenar el audio en una unidad SD ...
Aquí está el enlace a la documentación de clase generada. Se puede encontrar más información en el wiki y en mis blogs