Forum: Mikrocontroller und Digitale Elektronik Sprachausgabe mit Arduino


von Henrik S. (Gast)


Lesenswert?

Hallo,

ich habe mit einem Arduino UNO und einem Ultraschall-Sensor ein 
Entfernungsmessgerät gebaut, welches dann per Knopfdruck die Entfernung 
auf einem LC-Display anzeigt.
Jetzt hab ich mir gedacht es wäre doch nett wenn ich irgendwie auch noch 
eine Sprachausgabe bekommen könnte. Nach Benutzung der Suchfunktion und 
Google sieht es so aus als müsste ich noch zusätzlich ein Board haben 
das mit dem Audio umgeht. Ich will nicht wirklich was fertiges kaufen, 
dehalb hab ich mir gedacht ich könnte vielleicht den Arduino an meinen 
Raspberry Pi hängen und es darüber ausgeben lassen, das schränkt die 
Mobilität natürlich stark ein, aber die Sprachausgabe ist eher als 
Lernprojekt gedacht als eine dauerhafte Erweiterung.

Hat jemand Ansätze/Ideen?

Henrik

von c-hater (Gast)


Lesenswert?

Henrik S. schrieb:

> Jetzt hab ich mir gedacht es wäre doch nett wenn ich irgendwie auch noch
> eine Sprachausgabe bekommen könnte.

Ist im Prinzip überhaupt kein Problem, PWM-Ausgänge hat der Atmel genug.

Alles, was du an Hardware brauchst, ist ein Filter und ein Verstärker, 
wobei das beides natürlich auch eine Einheit bilden kann, da 
NF-Verstärker heutzutage ja sowieso fast alles OVs sind und mit 
entsprechender Beschaltung des Rückkopplungszweiges problemlos 
gleichzeitig als Filter dienen können.

Ein Problem bleibt allerdings: Die Samples brauchen recht viel Platz. 
Zwar reichen für Sprachausgabe 8 Bit Auflösung mit 11kHz Samplefrequenz 
völlig aus, aber auch das sind eben 11KByte/s. Da paßt nicht allzu viel 
von in einen AVR, in die größten gerade mal ca. 20 Sekunden.

Du brauchst also höchstwahrscheinlich externen Speicher, z.B. eine 
SD-Card.

von Henrik S. (Gast)


Lesenswert?

Also für eine Variante die nur mit dem AVR funktioniert dachte ich mir 
folgendes:

Wenn ich eine Entfernung von z.B. 1,23 cm habe liest der code die erste 
Zahl (1), sagt "eins", liest das Komma, sagt "Komma" etc...

Die zahlen von 0 - 9 und das Wort "Komma" kann ich in 1 sec packen, es 
muss ja nicht gut klingen.

Wie würde ich das denn Code-Technisch realisieren? Also wie sag ich dem 
Controller, dass er die erste Ziffer der Zahl lesen soll und wie gebe 
ich dann das wort "eins" aus?

Henrik

von holger (Gast)


Lesenswert?

>Also wie sag ich dem
>Controller, dass er die erste Ziffer der Zahl lesen soll und wie gebe
>ich dann das wort "eins" aus?

Vergiss dein Projekt einfach. Das ist drei Zehnerpotenzen zu hoch
für dich.

von Henrik S. (Gast)


Lesenswert?

>>Also wie sag ich dem
>>Controller, dass er die erste Ziffer der Zahl lesen soll und wie gebe
>>ich dann das wort "eins" aus?
>
> Vergiss dein Projekt einfach. Das ist drei Zehnerpotenzen zu hoch
> für dich.

Also meine erste Frage ziehe ich erstmal zurück, ich bleibe einfach bei 
ganzen Zahlen, d.h. ich brauche "nur" einen Weg, das Wort "eins" über 
einen Lautsprecher auszugeben. Wie gehe ich das an?

Henrik

von PittyJ (Gast)


Lesenswert?


von Yak54xy (Gast)


Lesenswert?

Einfachste und flexibelste Variante dürfte das abspielen einzelner 
wav-Files von einer SD-Karte sein. Für Arduino gibt es einige Beispiele 
für wav-Player.
Vom Prinzip her habe ich das auch so für die Ausgabe von Telemetriedaten 
gemacht, allerdings in BASCOM, mit entsprechenden Dateien: 1.wav, 2.wav,
100.wav, Komma.wav, Spannung.wav...., die dann aufgrund der 
aufbereiteten Daten nacheinander aufgerufen werden.

von Wusel D. (stefanfrings_de)


Lesenswert?

Ist das WAV Format dazu nicht unnötig komplex? Ich würde es mit Rohdaten 
versuchen, die einfach nur noch richtig getaktet in den D/A Wandler 
übertragen müssen.

Da fällt mir gerade ein: Es gibt doch MP3 Player Chips mit SD Interface, 
die man über eine serielle Schnittstelle dazu anweisen kann, eine Datei 
abzuspielen. Damit wäre es sicher am einfachsten - wenn man an so einen 
Chip heran kommen kann.

von Henrik S. (Gast)


Lesenswert?

Danke erstmal für die ganzen Antworten!

Ich würde das Ganze, wenn möglich, ohne zusätzliche Hardware (also 
zusätzliche Chips) realisieren. Ist das denn möglich?

Henrik

von Spess53 (Gast)


Lesenswert?

Hi

>Ich würde das Ganze, wenn möglich, ohne zusätzliche Hardware (also
>zusätzliche Chips) realisieren. Ist das denn möglich?

Ganz ohne wird es nicht gehen. Du willst ja schließlich auch etwas 
hören.

Vielleicht kannst du hierauf aufbauen:

http://www.atmel.com/Images/doc1456.pdf
http://www.atmel.com/Images/avr335.zip

MfG Spess

von Markus M. (mark_m)


Lesenswert?

Das generelle Problem ist ja die Größe der Audiodaten. Spiel doch ein 
bisschen mit Audacity oder einem ähnlichen Programm rum um zu ermitteln, 
bis zu welcher Sampelrate die Sprachausgabe noch erträglich ist.

Passen dann die Audiodaten und das Programm in das Flash ist das Problem 
gelöst. Die alten analogen Telefone waren von der Bandbreite auch 
bescheiden und dennoch konnten wir uns verständigen.

Grüsse

von c-hater (Gast)


Lesenswert?

Stefan Frings schrieb:

> Ist das WAV Format dazu nicht unnötig komplex?

Der Overhead von PCM-Wav ist kaum der Rede wert, das bissel 
IFF-Struktur-Gerümpel und der kleine Header fallen im Vergleich zu den 
Nutzdaten kaum in's Gewicht, selbst bei relativ kleinen Dateien, wie sie 
hier in der Anwendung benötigt werden würden.

Gegen die geringe Platzersparnis steht der Vorteil, daß sich die 
WAV-Dateien sehr leicht mit jedem beliebigen Audioprogramm erzeugen und 
ggf. auch nochmal bearbeiten lassen.

Also ich persönlich würde hier zwar sicher auch drüber nachdenken, 
RAW-Daten zu verwenden, aber mich letztlich wohl doch lieber für in 
einen WAV-Container verpackte entscheiden.

Wenn's wirklich eng werden sollte im Speicher, würde ich eher darüber 
nachdenken, einen einfachen Dekompressor (z.B. für ADPCM) zu 
implementieren. Sowas kann man nämlich auch in einen WAV-Container 
packen und dabei ca. 25..50% des Platzes bei kaum merklichen 
Qualitätsverlust sparen.

von Henrik H. (Firma: TU Chemnitz) (heha)


Lesenswert?

Hallo,
wenn zur Ausgabe eine Roboterstimme ausreichend verständlich ist, gibt 
es schon seit Urzeiten Lösungen, die ca. 8..16 Kilobyte groß sind.

Zwei Probleme tun sich auf:
* Es handelt sich um Abandonware, herrenlose Software ohne Quelltext
* Kann nur englisch, beim Versuch der Deutschanpassung klingt's immer 
noch englisch

Jemand bei Github hat sich dem Problem mit dem fehlenden Quelltext zum 
Glück angenommen, allerdings für eine Portierung auf 32 Bit - das ist ja 
keine Kunst!
Er/sie hat die Binärdateien disassembliert und decompiliert, es handelt 
sich nunmehr um C-Quelltext.

Ich habe seinen/ihren Quelltext weiter entschlackt und das Programm in 4 
(Windows-)Teilprogramme von < 8 KByte Größe aufgeteilt, von denen man 
für eine Ausgabe von Zahlen nur das 3. Teilprogramm für den Arduino aka 
AVR compilieren muss: Es rechnet Phoneme in PCM-Waveform um. Eine 
Sampletabelle von reichlich 1 KByte ist drin v.a. für die Zischlaute, 
während 3 Sinusgeneratoren per DDS für den Ton (der Vokale) sorgen.

So kommt man ohne externen Speicher aus. Die Phoneme sind nur wenig 
länger als geschriebener UTF-16-Text. Das erspart es, menschenlesbaren 
Text auf dem AVR in Phoneme übersetzen zu müssen, das kann man mit dem 
Windows-PC tun.

Siehe http://www.tu-chemnitz.de/~heha/Mikrocontroller/Sprache/#2

: Bearbeitet durch User
von Super (Gast)


Lesenswert?

Na das ist doch mal eine schnelle Antwort.

von Armin J. (arminj)


Lesenswert?


von Henrik H. (Firma: TU Chemnitz) (heha)


Lesenswert?

Aha, wieder was gelernt, danke!

Gibt's schon lange, nur zu finden war's für mich nicht, weil's eben 
kein Text-To-Speech ist (was hier auch gar nicht nötig erscheint) 
sondern LPC: https://de.wikipedia.org/wiki/Linear_Predictive_Coding

Da muss jemand die Wörter (am PC) einsprechen, und mit etwas Glück 
kling's dann akzentfrei deutsch, bis auf die Kompressionsartefakte 
natürlich. Oder man nimmt die vorgesprochenen (englischen) Fragmente, 
die Teil der o.a. Software ist.

Was ich aus der angegebenen Quelle nicht erfassen konnte: Wie sieht es 
hierbei mit dem Flash-Speicherbedarf aus? Also wieviel Kilobyte fix für 
den Dekompressor und wieviel Byte/Kilobyte im Mittel pro Silbe?
Das könnte man in der readme.md des Github-Projekts angeben. Auch die 
Abkürzung LPC auftrieseln, meist ist's Local Procedure Call.

von Thomas K. (ek13)


Angehängte Dateien:

Lesenswert?

Google mal WTV020
U-Disk Audio Player SD card Voice Module MP3 Voice Module WTV020-SD-16P

von chris_ (Gast)


Lesenswert?

>Aha, wieder was gelernt, danke!

>Gibt's schon lange, nur zu finden war's für mich nicht, weil's eben
>kein Text-To-Speech ist (was hier auch gar nicht nötig erscheint)
>sondern LPC: https://de.wikipedia.org/wiki/Linear_Predictive_Coding

Die Umsetzung des Projekts ist eine enorme Leistung. Kaum einer würde 
glauben, dass man eine LPC-Dekoder mit den ganzen notwendigen 
Muliplikationen auf einem AVR umsetzen kann.
Umso erstaunlicher ist, dass der ursprüngliche Code von "Text and 
Speech" 1978 stammt.

https://de.wikipedia.org/wiki/Texas_Instruments_LPC-Sprachchips

von Falk B. (falk)


Lesenswert?

Henrik S. schrieb:
> Hat jemand Ansätze/Ideen?

SD-Karte + PWM-Ausgang

Beitrag "Re: Arduino Nano, SD Card, PCM"

Wenn es relativ wenige Samples sind, könnte man die direkt in den Flash 
eines ArduinoMEGA packen, der hat 256kB. Allerdings muss man zur 
Ausnutzung der vollen 256 kB tricksen und ggf. ein neues Linkerscript 
erstellen, denn die originalen im Arduino ermöglichen maximal 64kB Daten 
und 128kB Programmspeicher!

https://www.mikrocontroller.net/articles/Kategorie:AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.