Forum: Mikrocontroller und Digitale Elektronik Sprachsynthese mit PIC (ohne ext. Speicher)


von __gb__ (Gast)


Lesenswert?

Hallo,
ich würde gerne eine Sprachsynthese der Ziffern 0..9 (englisch) 
realisieren. Ziel wäre ein kleiner PIC mit vielleicht 7k oder 14k Flash. 
Ohne zusätzlichen Speicher.
Kennt jemand so ein Projekt?

gb

von Max H. (hartl192)


Lesenswert?

Ich denke, mit nur 14k Flash ist es nicht so einfach möglich.
In Telefonqualität, hat ein Audiosignal 8000 Byte/s (8Bit * 
8000Sampel/s). Wenn man davon ausgeht, dass eine Ziffer 0,5 Sekunden 
dauert, wären das 40kBytes. Für eine Codierung wie MP3 wird so ein 
kleiner PIC zu wenig Rechenleistung habe und es wäre ein externer MP3-IC 
notwendig.
Mit einem 18F26k22 (64k Flash) für <2€ wäre es möglich.
Wenn 0.35s pro Ziffer reichen, könnte man auf einen PIC18F25K20 für 
<1,50€ umstiegen. 10*0,35*8000=28kB, dann wären noch 4kB = 4kWorte für 
das Programm übrig.
Ich habe getestet, 0.35s könnten riechen.

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Es geht mit deutlich weniger Speicher bzw. gespeicherten Samples. Ich 
habe eigene Versuche mit einem Arduino Uno gemacht.

Die Soundschnipsel (ebenfalls Zahlen, aber deutsch) habe ich mit 
Audacity bearbeitet (hauptsächl. Höhen und Tiefen beschnitten und alle 
Samples gleich lang) und dann als unkomprimierte WAVE-Files gesichert. 
Eine Samplingrate von 4kHz 8 Bit Mono Länge je ca 0,3 s ergab immer noch 
hinreichende Verständlichkeit. Das ergibt für die Ziffern 0..9 und 
"Komma" ca. 15 kB (von 32kB ROM des Arduino Uno).

Die Ausgabe erfolgte über eine PWM mit 32 kHz. Die Header der Wavefiles 
sind nur ein par Byte, die kann man ignorieren, sie haben keinen 
wahrnehmbaren Einfluss auf den Sound. Ich habe die Daten mit einem 
selbstgeschriebenen Tool in Dezimalzahlen (ASCII) umgewandelt und als 
Datenblock in den Programmcode hineinkopiert ...

von c-hater (Gast)


Lesenswert?

Max H. schrieb:

> Ich denke, mit nur 14k Flash ist es nicht so einfach möglich.
> In Telefonqualität, hat ein Audiosignal 8000 Byte/s (8Bit *
> 8000Sampel/s). Wenn man davon ausgeht, dass eine Ziffer 0,5 Sekunden
> dauert, wären das 40kBytes. Für eine Codierung wie MP3 wird so ein
> kleiner PIC zu wenig Rechenleistung habe und es wäre ein externer MP3-IC
> notwendig.

Es gibt auch noch andere Kompressionsverfahren als MP3. Unter anderem 
auch welche, die um Größenordnungen geringere Anforderungen an die 
Rechenzeit stellen als MP3, gegenüber Raw-PCM aber trotzdem erheblich 
Speicherplatz/Bandbreite sparen, ohne die Qualität dabei allzusehr in 
Mitleidenschaft zu ziehen.

Ein sehr einfach zu implementierender Vertreter dieser 1. Generation der 
Audio-Codecs ist z.B. ADPCM. Bringt die gleiche Speicherplatzersparnis 
wie die Halbierung der Samplerate oder die 16telung der Auflösung, wirkt 
sich aber auf die Tonqualität längst nicht so verheerend aus wie diese 
beiden Ansätze...

Das mag ein Grund dafür sein, daß er (bzw. vergleichbare Technologien) 
zumindest als Fallback bis heute noch eingesetzt werden, z.B. bei GSM 
und ISDN.

von Frank M. (frank_m35)


Lesenswert?

http://www.romanblack.com/picsound.htm

"BTc is a sound conversion and compression algorithm. 1-bit sound is 
always "compressed" ie, 8 times smaller data than normal 8-bit PCM 
sound. It is also a much lower sound qualit"

"Voice at 19.5kHz (above) is more of a challenge. [..] The noise 
artifacts are mainly bitrate /2 /3 /4. At 19.5kHz bitrate these are 
quite low noise frequencies of 9.7kHz, 6.5kHz and 4.8kHz which are loud 
to the ear so a fairly heavy hardware filter was used at about 5kHz [..] 
The sound of the voice was gritty and fizzy but was still fully 
understandable and suitable for simple applications."


D.h. bei 1-Bit und 19.5kHz macht das 2.4kB/s. Wenn man mit dem 0.35s von 
Max. H rechnet, brauchst du damit für deine 10 Zahlen 8.4kB. D.h mit 
deinem 14kB PIC kommst du aus.

Probier einfach aus, ob dir die Soundqualität reicht.

von __gb__ (Gast)


Lesenswert?

Danke schoen, Jungs.
Das klingt ja gar nicht so schlecht. Also kein deutliches "NEIN".
Ich werde experimentieren.

von Svenska (Gast)


Lesenswert?

Und dann gibt es ja auch noch Sprachsynthese. Dann braucht man die 
Samples nicht auf dem Chip zu speichern, weil man sie bei Bedarf erzeugt 
- klingt aber dafür wie ein Roboter.

von __gb__ (Gast)


Lesenswert?

>Und dann gibt es ja auch noch Sprachsynthese.
Gibts für den PC Tools, mit denen man sagen wir 10 Schieberegler hat. 
Der erste erzeugt ein 100Hz Sinus, der zweite einen 200Hz ... so dass 
ich praktisch 100Hz Ton und die entsprechenden Oberwellen hab.
Um so Klänge zu erzeugen.

von Frank K. (fchk)


Lesenswert?

__gb__ schrieb:
> Hallo,
> ich würde gerne eine Sprachsynthese der Ziffern 0..9 (englisch)
> realisieren. Ziel wäre ein kleiner PIC mit vielleicht 7k oder 14k Flash.

Warum diese Beschränkung? Es gibt den dsPIC33FJ128GP802. 40MHz, 16k RAM, 
128k Flash, Stereo Audio DAC, DSP Extensions. Der ist für solche 
Aufgaben gemacht, und das Ergebnis wird mit Sicherheit besser klingen. 
Für die Sprachdatenkompression gibts von Microchip ADPCM, G.726 und 
SPEEX Libraries.

http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en532298
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2680&dDocName=en023610

fchk

von __gb__ (Gast)


Lesenswert?

Der PIC mit 7k kann halt anderes, was der dsPIC33FJ128GP802 nicht kann.

von Max H. (hartl192)


Lesenswert?

__gb__ schrieb:
> Der PIC mit 7k kann halt anderes, was der dsPIC33FJ128GP802 nicht kann.
Und was wäre das? Sind die Kosten wichtig?

von __gb__ (Gast)


Lesenswert?

- hat nen 20Bit NCO
- kostet 1Euro

von Chris S. (schris)


Lesenswert?

ist der pic ein 7k mal 8bit oder 7k mal 14bit und kommt man an die 14bit 
ran ? Denn dies ist ein riesen Unterschied.

Hast du dir die AN643 mal angesehen ? Wenn man sie von 16bit auf 10bit 
umschreibt dann passt sie gut zu den  einfacheren pics.

von Sascha (Gast)


Lesenswert?

16F-PICs haben 1k, 2k, 4k oder 8k-Worte a 14bit. Das PICsound-Programm 
gibt u.a. die Daten per retlw+Bitmuster aus, so werden 6bits pro Wort 
verschwendet. Wenn man perl kann, könnte man sich die Daten umrechnen 
lassen, sodass alle 14bit eines Wortes mit dem DA-Pseudobefehl genutzt 
werden ( http://www.sprut.de/electronic/pic/assemble/pseudo.html#daten )
Man muss dann aber darauf achten, dass der PIC in der Lage ist, seinen 
eigenen Flash zu lesen, der PIC16F886 zb. kanns. Ebenso ist dann etwas 
mehr Rechenleistung gefragt, denn während der Zeit zwischen den 
Sample-Ausgaben muss der Flash gelesen, "entpackt" und der 
Ausgaberoutine übergeben werden. Da du aber relativ langsam samplen 
musst damit alles in den Flash passt, sollte genug Zeit sein.

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.