Микроконтроллеры не имеют достаточного количества ресурсов, чтобы обеспечить высококачественную функциональность «текста» для речи. Однако часто это может быть достаточно хорошим, чтобы обеспечить решение, основанное на некотором предварительно записанном аудио.
Мне было интересно об ограничениях этого подхода и решил внедрить небольшую прототип библиотеки Arduino, которая основана на аудио -инструментах Arduino для аудиовывода.
Чтобы все было просто, я начал с простой реализации, которая может обрабатывать цифры и, кроме того, еще одна, которая читает время. Таким образом, отправной точкой являются некоторые классы, которые переводят числа в текст. Затем текст используется для идентификации предварительно записанных аудиофайлов.
Эту функциональность можно использовать, например, для создания некоторых
NumberTotext переводит номер ввода в audio_tools :: вектор слов. В следующих примерах мы просто распечатываем их:
NumberToText ntt;
auto result = ntt.say( 700123.431 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Результат: семь сотен тысяч сотней двадцати трех точек Тять Три ОДНО
Чтобы обработать время, необходимо для предоставления часов и рук в качестве входных данных.
TimeToText ttt;
auto result = ttt.say( 12 , 00 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Результат: полдень
Вы также можете обрабатывать числа с соответствующими единицами
NumberUnitToText utt;
auto result = utt.say( 1.01 , " usd " );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Результат: один доллар США и один цент
Если мы записываем слова в mp3, мы могли бы даже сойти с рук с необходимостью отдельного SD -диска, потому что мы можем сохранить аудио в памяти программы. ExampleAudictionaryValues содержит предварительные файлы MP3, которые хранятся в 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 () {
}
Слово «миллиард» произносится через I2.
Вы также можете использовать классы генерации текста, описанные выше:
# 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 () {
}
Это выведет результат аудио через I2S.
Вот информация для эскиза, которая обеспечивает поддержку разговора и номера и хранит все аудиофайлы как mp3 в Progmem on 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
Я думаю, что это оставляет много запасных, и у вас все еще есть возможность хранить аудио на SD Drive ...
Вот ссылка на документацию сгенерированного класса. Дополнительную информацию можно найти в вики и в моих блогах