Software Automatischer Mund - Tiny Speechsynthesizer
Dies ist ein Go -Port des großen SAM -Sprachsynthesizers. Es ist im Grunde genommen ein halbautomatisches Umschreiben von C, um zu gehen, was wiederum eine halbautomatische Umschreibung von der Versammlung zu C war :). Infolgedessen soll dies nicht lesbar sein.
Original Repo: https://github.com/vidarh/sam. Basierend auf diesem Commit.
Als Herausforderung und nur zum Spaß.
Sam ist ein sehr kleines Text-zu-Speech-Programm (TTS), das in C geschrieben wurde und auf den beliebtesten Plattformen ausgeführt wird. Es ist eine Anpassung an C der Sprachsoftware SAM (Software Automatic Mund) für den im Jahr 1982 von Don't Ask Software (Now Softvoice, Inc.) veröffentlichten Commodore C64. Es enthält einen Text-zu-Phonem-Konverter namens Reciter und eine Phonem-zu-Sprache-Routine für die endgültige Ausgabe. Es ist so klein, dass es auch auf eingebetteten Computern funktioniert. Auf meinem Computer dauert es weniger als 39 KB (viel kleiner auf eingebetteten Geräten, da die ausführbare Übertragung nicht erforderlich ist) des Speicherplatzes und ein vollständig eigenes Programm. Für die sofortige Ausgabe verwendet es die SDL-Bibliotheks-Bibliothek, ansonsten kann es .wav-Dateien speichern.
Eine Online -Version und ausführbare für Windows finden Sie auf der Website: http://simulationcorner.net/index.php?page=sam
Geben Sie einfach "Make" in Ihre Eingabeaufforderung ein. Um ohne SDL zu kompilieren, entfernen Sie die SDL -Anweisungen aus den CFLAGs und LFLAGs -Variablen in der Datei "Makefile".
Es sollte auf jedem Unix-ähnlichen Betriebssystem kompilieren. Für Fenster benötigen Sie Cygwin oder Mingw ( + libsdl).
Typ
./sam I am Sam
für die erste Ausgabe.
Wenn Sie SDL -Versuch deaktiviert haben
./sam -wav i_am_sam.wav I am Sam
um eine WAV -Datei zu erhalten. Diese Datei kann von vielen für den PC verfügbaren Medienspieler gespielt werden.
Sie können andere Optionen wie -Pitch -Nummer -Geschwindigkeitsnummer -Throat -Nummer -mouth -Nummer ausprobieren
Einige typische Werte, die im Originalhandbuch geschrieben wurden, sind:
DESCRIPTION SPEED PITCH THROAT MOUTH
Elf 72 64 110 160
Little Robot 92 60 190 190
Stuffy Guy 82 72 110 105
Little Old Lady 82 32 145 145
Extra-Terrestrial 100 64 150 200
SAM 72 64 128 128
Es kann sogar einen Blick auf die Datei "Sing" für ein kleines Beispiel singen.
Für die Phonem -Eingangstabelle schauen Sie im Wiki.
Eine Beschreibung der zusätzlichen Funktionen finden Sie im Originalhandbuch unter http://www.retrobits.net/atari/sam.shtml oder im Handbuch des äquivalenten Apple II-Programms http://www.apple-iigs.info/newdoc/sam.pdf
Dieses Programm wurde semi-automatisch in C konvertiert, indem jeder Assembler-Opcode umgewandelt wurde. z.B
lda 56 => A = mem[56];
jmp 38018 => goto pos38018;
inc 38 => mem[38]++;
. .
. .
Dann wurde man manuell neu geschrieben, um die meisten Sprünge zu entfernen und Variablen im Code zu registrieren und die Variablen in Eigennamen umzubenennen. Der größte Teil der folgenden Beschreibung ist ein Ergebnis dieses Umschreibens.
Leider ist es immer noch nicht sehr gut lesbar. Aber du solltest sehen, wo ich angefangen habe :)
Zunächst werde ich mich hier auf eine sehr grobe Beschreibung beschränken. Es gibt sehr viele Ausnahmen in dem Quellcode, den ich nicht erklären werde. Auch viel Code ist für mich unbekannt, EG Code47503. Für ein vollständiges Verständnis des Codes brauche ich mehr Zeit und besonders mehr Augen schauen den Code an.
Es ändert den englischen Text durch einen im Wiki gezeigten Regeln in Phoneme.
Die Regel "Ant (i)", "ay" bedeutet, dass, wenn er ein "I" mit früheren Briefen "Ameise" findet, das I durch das Phonem "ay" austauschen.
Es gibt einige besondere Zeichen in diesen Regeln wie # & @ ^ +: %, was bedeuten kann, dass es einen Gesang oder einen Konsonanten oder etwas anderes geben muss.
Mit der Option -debug erhalten Sie die entsprechenden Regeln und die resultierenden Phoneme.
Hier ist der volle Baum der Unterroutine -Anrufe:
Sammain () parser1 () parser2 () insert () copypress () setPhonemelength () code48619 () code41240 () insert () code48431 () insert ()
Code48547
Code47574
Special1
Code47503
Code48227
Sammain () ist die Eintragsroutine und ruft alle weiteren Routinen auf. Parser1 transformiert den Phonemeingang und transformiert sie in drei Tabellen PhonemeIndex [] Spannung [] Phonemelength [] (Null zu diesem Moment)
Diese Tabellen werden jetzt geändert:
Parser2 tauscht einige Phoneme durch andere aus und fügt neue ein. Copypress fügt unter bestimmten Umständen die Phonemlängen von SetPhonemelength zu 1 zu der Spannung. CODE48619 ändert das Phonem Längencode41240 fügt einige zusätzliche Phonemes -Code48431 hinzu
Das Wiki zeigt alle möglichen Phoneme und einige Flaggenfelder.
Der endgültige Inhalt dieser Tabellen ist mit dem Befehl -debug zu sehen.
In der Funktion Prepeoutput () werden diese Tabellen teilweise in die kleinen Tabellen kopiert: PhonemeIndexoutput [] SpannungsOutput [] PhonemelengthOutput [] für die Ausgabe.
Mit Ausnahme einiger spezieller Phoneme wird der Ausgang durch eine lineare Kombination erstellt:
A = A1 * sin ( f1 * t ) +
A2 * sin ( f2 * t ) +
A3 * rect( f3 * t )
wo Rechtek eine rechteckige Funktion mit der gleichen Periodizität wie Sünde ist. Es scheint wirklich seltsam, aber das reicht für die meisten Arten von Phonemen wirklich aus.
Daher werden die obigen Phoneme mit einigen Tabellen in Stellungen umgewandelt [] Frequenz1 [] = F1 Frequenz2 [] = F2 Frequenz3 [] = f3 Amplitude1 [] = A1 Amplitude2 [] = A2 Amplitude3 [] = A3
Die obige Formel wird in einer sehr guten omptimisierten Routine berechnet. Es besteht nur aus 26 Befehlen:
48087: LDX 43 ; get phase
CLC
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl1,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
STA 56 ; store
LDX 42 ; get phase
LDA 42240,x ; load sine value (high 4 bits)
ORA TabAmpl2,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC Var56 ; add with previous values
STA 56 ; and store
LDX 41 ; get phase
LDA 42496,x ; load rect value (high 4 bits)
ORA TabAmpl3,y ; get amplitude (in low 4 bits)
TAX
LDA 42752,x ; multiplication table
ADC 56 ; add with previous values
ADC #136
LSR A ; get highest 4 bits
LSR A
LSR A
LSR A
STA 54296 ;SID main output command
Der Rest wird auf besondere Weise behandelt. Im Moment kann ich nicht auf welche Weise herausfinden. Es scheint jedoch, dass es ein Rauschen (z. B. für "s") verwendet, indem eine Tabelle mit zufälligen Werten verwendet wird.
Die Software ist eine umgekehrte Version einer kommerziellen Software, die vor mehr als 30 Jahren veröffentlicht wurde. Der aktuelle Copyright -Halter ist Softvoice, Inc. (www.text2speech.com)
Jeder Versuch, das Unternehmen zu kontaktieren, scheiterte. Die Website wurde zuletzt im Jahr 2009 aktualisiert. Der Status der ursprünglichen Software kann daher am besten als Habeware (http://en.wikipedia.org/wiki/abandonware) beschrieben werden.
Solange dies der Fall ist, kann ich meinen Code nicht unter eine bestimmte Open -Source -Software -Lizenz einsetzen, die ihn auf eigenes Risiko verwendet.
Wenn Sie Fragen haben, zögern Sie nicht, mir zu fragen. Wenn Sie neue Kenntnisse über den Code entdeckt haben, mailen Sie mir bitte.
Sebastian Macke E -Mail: [email protected]