Mikrocontroller verfügen nicht über genügend Ressourcen, um eine hochwertige "Text für die Sprache" -Funktionalität bereitzustellen. Oft kann es jedoch gut genug sein, eine Lösung zu liefern, die auf einigen aufgezeichneten Audioen basiert.
Ich habe mich über die Grenzen dieses Ansatzes gefragt und beschlossen, eine kleine Prototype Arduino -Bibliothek zu implementieren, die auf den Arduino -Audio -Tools für die Audioausgabe basiert.
Um die Dinge einfach zu halten, begann ich mit einer einfachen Implementierung, die Zahlen verarbeiten und darüber hinaus die Zeit liest. Der Ausgangspunkt sind also einige Klassen, die Zahlen in Text übersetzen. Der Text wird dann verwendet, um die vorgezeichneten Audiodateien zu identifizieren.
Diese Funktionalität kann verwendet werden, um einige zu erstellen
NumberTotext übersetzt die Zahleneingabe in ein Audio_Tools :: Vector of Words. In den folgenden Beispielen drucken wir sie einfach aus:
NumberToText ntt;
auto result = ntt.say( 700123.431 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Das Ergebnis ist: siebenhunderttausend einhundertundzwanzig Punkte vier drei eins null Null Null
Um die Zeit zu verarbeiten, die Sie benötigen, um die Stunden und Minuts als Eingabe bereitzustellen.
TimeToText ttt;
auto result = ttt.say( 12 , 00 );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Das Ergebnis ist: Mittag
Sie können auch Zahlen mit den entsprechenden Einheiten verarbeiten
NumberUnitToText utt;
auto result = utt.say( 1.01 , " usd " );
for ( auto str : result){
Serial. print (str);
Serial. print ( " " );
}
Das Ergebnis ist: ein US -Dollar und ein Cent
Wenn wir die Wörter in MP3 aufzeichnen, können wir sogar mit der Notwendigkeit eines separaten SD -Laufwerks davonkommen, da wir das Audio im Programmspeicher speichern können. Die Beispielpleaudicalary -Werte enthält die aufzeichneten MP3 -Dateien, die im Progmem gespeichert sind.
# 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 () {
}
Das Wort "Milliarden" wird über I2s ausgesprochen.
Sie können auch die oben beschriebenen Textklassen verwenden:
# 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 () {
}
Dadurch wird das Audioergebnis über I2s ausgegeben.
Hier finden Sie die Informationen für eine Skizze, die Gesprächszeit- und Zahlenunterstützung bietet und alle Audiodateien als MP3 in Progmem auf als ESP32 speichert:
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
Ich denke, das hinterlässt viel Kopffreiheit und Sie haben immer noch die Möglichkeit, das Audio auf einem SD -Laufwerk zu speichern ...
Hier ist der Link zur generierten Klassendokumentation. Weitere Informationen finden Sie im Wiki und in meinen Blogs