Os microcontroladores não têm recursos suficientes para fornecer uma funcionalidade de alta qualidade 'texto à fala'. No entanto, muitas vezes pode ser bom o suficiente para fornecer uma solução baseada em algum áudio pré-gravado.
Fiquei me perguntando sobre as limitações dessa abordagem e decidi implementar uma pequena biblioteca de protótipo Arduino, baseada nas ferramentas de áudio Arduino para a saída de áudio.
Para simplificar as coisas, comecei com uma implementação simples que pode processar números e, além disso, outro que lê o tempo. Portanto, o ponto de partida são algumas classes que traduzem números em texto. O texto é então usado para identificar os arquivos de áudio pré-gravados.
Esta funcionalidade pode ser usada, por exemplo, para construir alguns
NumberTotext traduz o número de entrada em um Audio_tools :: Vector of Words. Nos exemplos a seguir, acabamos de imprimi -los:
NumberToText ntt;
auto result = ntt.say( 700123.431 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
O resultado é: setecentos mil cento e vinte e três pontos quatro três um zero zero zero
Para processar o tempo, você precisa fornecer as horas e os minuts como entrada.
TimeToText ttt;
auto result = ttt.say( 12 , 00 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
O resultado é: meio -dia
Você também pode processar números com as unidades correspondentes
NumberUnitToText utt;
auto result = utt.say( 1.01 , " usd " );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
O resultado é: um dólar americano e um centavo
Se gravarmos as palavras no MP3, podemos até se safar da necessidade de uma unidade SD separada, porque podemos armazenar o áudio na memória do programa. O ExampleAudiodictionaryValues contém os arquivos MP3 pré -gravados que são armazenados no 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 () {
}
A palavra "bilhão" é falada via i2s.
Você também pode usar as classes de geração de texto descritas acima:
# 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 () {
}
Isso produzirá o resultado do áudio via i2s.
Aqui está a informação para um esboço que fornece suporte de tempo de discussão e suporte ao número e armazena todos os arquivos de áudio como MP3 em Progmem ON como 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
Eu acho que isso deixa bastante espaço e você ainda tem a opção de armazenar o áudio em uma unidade SD ...
Aqui está o link para a documentação da classe gerada. Mais informações podem ser encontradas no wiki e em meus blogs