Nachdem ich mir an chinesischen Fakes klassischer Sprachsynthesizer Chips die Finger verbrannt hatte, wollte ich doch nochmal eine Sprachausgabe für alte Computer realisieren.
Möglichst system-unabhängig, d.h. über eine serielle Schnittstelle.
Dabei bin ich auf den aktuellen XFS5152CE von IFLYTEK gestoßen.
Der XFS5152CE Speech Synthesis Chip verarbeitet englischen (und chinesischen) Klartext, d.h. man muss keine Allophone oder ähnliche Bruchstücke zusammensetzen.
Er hat einen 4KB Puffer, kann also eine ganze Menge Text puffern und dann autonom wiedergeben während der Rechner schon etwas anderes macht.
Sonderfunktionen können über in die Zeichenkette eingebettete Befehle in eckigen Klammern erreicht werden.
Neben verschiedenen Stimmen gehören dazu auch Tonhöhe, Geschwindigkeit, Lautstärke, und auch 75 vorgefertigte Alarm-Sounds.
Das funktioniert recht ordentlich und man kann mit etwas Gefummel auch deutsche Sätze halbwegs verständlich herausbekommen.
[Er hat auch eine Aufnahme und Erkennungsfunktion; die habe ich nicht ausprobiert.]
Ich habe mir zum Ausprobieren eine der Fertigplatinen für unter 20 Euro gekauft und zunächst einen kleinen 50 Ohm Lautsprecher direkt angeschlossen.
Die Platine hat eine etwas unpraktisch nach unten ragende Stiftleiste, auf der alle Anschlüsse verfügbar sind.
(Neben seriell 4800, 9600. 19200, 115200 kann man auch SPI oder I2C verwenden).
Für die Ansteuerung des Chips habe ich zuerst mal einen Raspberry Pico benutzt, da der ebenfalls mit 3.3V arbeitet.
Mit dem Micromite BASIC war es möglich, schnell zu experimentieren, vor allem, um das Warten auf den Chip richtig zu implementieren.
Wenn man nicht auf die Bereitschaft wartet, stoppt die laufende Ausgabe und die neue startet sofort.
Man kann damit sehr einfach eine Sprachausgabe-Box mit z.B. RS232C zum Anschluss an alle möglichen Rechner realisieren.
Nur ein RS232C auf 3.3V TTL Wandler und eine 3.3V Stromversorgung sind dafür notwendig.
Der 50 Ohm Lautsprecher ist zwar hörbar (8 Ohm ist eine zu hohe Last) aber doch zu leise - ich habe dann einen kleinen mit zwei Micro-Batterien betriebene Taschenlautsprecher/Verstärker angeschlossen - damit ist das Signal schön klar - schon zu laut für's stille Kämmerchen.
Da der Chip mit 3.1 bis 4.5 V spezifiziert ist (I/O Pins mit 3.6 V), sollte er und der Lautsprecher auch gut mit einer 3.7V Lithium-Akkuzelle betreibbar sein.
Das beigefügte Sample ist mit einem Billigstmikrofon an einem alten Laptop aufgenommen - man muss sich das Rauschen wegdenken, dann bekommt man zumindest einen Eindruck von der Aussprache.
Die Tonqualität ist im Original aber sehr gut, ohne jedes Rauschen.
Mein Testprogramm:
'
' XFS5152CE Test program
'
' XFS5162CE Board
' Raspberry Pico RP2
'
' GND - 1 2 - 3.3V
' 3 4 - SPEAKER
' 5 6 - SPEAKER
' 7 8 - 3.3V TTL RXD GP0
' 9 10 - 3.3V TTL TXD GP1
' .. ..
'
' Martin hepperle, 2022
'
Dim msg$ As string
Dim x$ As string
SetPin GP1,GP0,COM1
Open "COM1:9600" As #1
' Männchen
msg$="[m51][h2][s5][v2]Verein zum Erhalt klassischer Computer"
PlaySound msg$
' Weibchen
msg$="[m53][h2][s5][v2]Ver eyene zum Erhahlt klah ssischer Computer"
PlaySound msg$
msg$="put the red pen into the plotter and then press the enter key"
PlaySound msg$
msg$="[g2]60[p500]50[p500]40[p500]30 retard! retard! I said, retard! Don't you hear?"
PlaySound msg$
msg$="[h0]Sorry, I cannot do this [g4] 3 2 1 0 is [g2]3210"
PlaySound msg$
msg$="[v3][t3][s7][m2]Do you need money? Your account has [n2]12345 Euros"
PlaySound msg$
' jo mei des gehd fei nedd!
msg$="[h0]Hahloh[p500] Wee geht as eenen hautah?"
PlaySound msg$
msg$="[v3][h2]Hahlloh. Weer keunnen ahless [v5]auhsser[v3] houch doitsh"
PlaySound msg$
For i=101 To 125
msg$="sound"+Str$(i)
PlaySound msg$
Next i
For i=201 To 225
msg$="sound"+Str$(i)
PlaySound msg$
Next i
For i=301 To 325
msg$="sound"+Str$(i)
PlaySound msg$
Next i
Close #1
End
' ---------------------------------
Sub PlaySound msg$
Local m$ As string
Local length, cmd, enc As integer
WaitSoundReady
Print msg$
m$=msg$+" "
length=Len(m$)
cmd=1
enc=2
m$=Chr$(&HFD)+Chr$(length\256)+Chr$(length Mod 256)+Chr$(cmd)+Chr$(enc)+m$
Print #1,m$
End Sub
' ---------------------------------
Sub WaitSoundReady
Local msg$ As string
Local x$ As string
' until serial buffer empty
Do While Lof(#1)<256
Pause 10
Loop
' ask for status
msg$=Chr$(&HFD)+Chr$(0)+Chr$(1)+Chr$(&H21)
Print #1,msg$
' wait until ready
Do
Do
x$=Input$(1,#1)
Pause 10
Loop Until Len(x$)=1
Loop Until x$=Chr$(&H4F)
End Sub
' ---------------------------------
Alles anzeigen