Sprechen Sie Ziffern von 0 bis 9 laut


15

Inspiriert von dieser Frage von electronics.SE , ist hier eine Herausforderung für Sie:

Schreiben Sie ein Programm oder Unterprogramm, das eine Folge von Dezimalstellen (0 bis 9) einliest und diese laut ausspricht, ohne ein vorhandenes Sprachsynthesewerkzeug zu verwenden.

Eingang:

Sie können verlangen, dass die Eingabeziffern in einem angemessenen Format angegeben werden, z. B. als Zeichenfolge aus ASCII-Ziffern, als Array aus Ganzzahlen, als BCD-codierte Zahl usw. Wenn Ihre Lösung ein ausführbares Programm ist, können Sie die Eingabe als übernehmen einen Befehlszeilenparameter, lesen Sie ihn von der Standardeingabe oder rufen Sie ihn auf eine andere vernünftige Weise ab.

Ihr Programm muss mindestens acht Stellen pro Aufruf sprechen können . Sie können davon ausgehen, dass die erste Ziffer nicht Null ist, es sei denn, es ist die einzige Ziffer.

Ausgabe:

Ihr Programm kann die Nummern entweder direkt mit einem Audiogerät sprechen oder eine abspielbare Audiodatei ausgeben. Die Ausgabedatei kann, falls vorhanden, ein Standard-Audioformat haben oder aus Rohdaten bestehen. Wenn Sie Rohdaten ausgeben, beachten Sie bitte die entsprechenden Parameter für die Wiedergabe (Abtastrate, Bits pro Abtastung, Endian, Signed / Unsigned, Anzahl der Kanäle). Formate, die von aplay unterstützt werden, werden bevorzugt.

Sie können frei entscheiden, wie die Zahlen gesprochen werden sollen. Ihre Ausgabe sollte jedoch aus englischen Ziffern bestehen, die für einen typischen englischen Sprecher verständlich sind , und klar genug sein, damit der Hörer sie genau transkribieren kann eine gesprochene achtstellige Zufallszahl. Nein, nur n- mal piepen zählt nicht. Vergessen Sie nicht, Pausen zwischen den Ziffern einzufügen.

Wertung:

Es gelten die Standardregeln für die Wertung: Ihre Wertung ist die Länge Ihres Codes in Bytes oder, wenn Ihr Code in Unicode-Text geschrieben ist, in Unicode-Zeichen. Die niedrigste Punktzahl gewinnt. Jede Sprache geht.

Da es sich bei der ursprünglichen Frage zu electronics.SE um Embedded-Programmierung handelte, erschien es mir angebracht, Autoren, die einfache Sprachen verwenden, einen Bone zuzuwerfen: Wenn Ihre Lösung in einer kompilierten Sprache geschrieben ist, können Sie die Länge von zählen kompilierte ausführbare Datei in Bytes als Ihre Punktzahl. (Ja, vorkompilierter Bytecode, z. B. eine Java- .classDatei, ist ebenfalls in Ordnung.) Wenn Sie diese Option nutzen möchten, fügen Sie Ihrer Antwort eine Kopie der kompilierten ausführbaren Datei (z. B. als Hex-Dump) zusammen mit Ihrem Quellcode bei und die Compilerversion und die Optionen, die Sie zum Generieren verwendet haben.

Eine lobende Erwähnung , zusammen mit einer 50 rep Prämie wird auf die ersten Antwort erteilt wird , dass auch die Kriterien der trifft ursprünglichen Frage ist also fähig auf einem Embedded - MCU mit 4 kb von Flash und 1 kb von SRAM ausgeführt wird .

Beschränkungen:

Sie dürfen keine Dateien oder Netzwerkressourcen verwenden , die nicht Teil der Standardlaufzeitumgebung Ihrer Sprache sind, es sei denn, Sie zählen die Länge dieser Dateien oder Ressourcen als Teil Ihrer Punktzahl. (Dies ist zB zu verbieten, Audio-Samples aus dem Web zu laden.)

Sie dürfen auch keine bereits vorhandenen Sprachsynthesetools oder -bibliotheken oder Zusammenstellungen von Audiodaten verwenden (es sei denn, Sie zählen auch deren Größe als Teil Ihrer Partitur), selbst wenn diese in der Standardlaufzeitumgebung Ihrer gewählten Sprache enthalten sind.


Ps. Ich kann später eine eigene Lösung posten, wenn ich es schaffe, etwas zu produzieren, das sich tatsächlich verständlich anhört. Scheuen Sie sich jedoch nicht, Ihre eigenen zu veröffentlichen. Zu diesem Zeitpunkt ist jede Antwort eine gute Antwort.
Ilmari Karonen

1
Dürfen wir eine Datenbank mit gesprochenen Ziffern herunterladen (und deren Größe zur Partitur hinzählen) oder müssen wir unsere eigene Stimme aufnehmen? Ich bezweifle, dass ich Sprachsamples algorithmisch generieren kann.
John Dvorak

ähm ... der Abschnitt "Ausgabe" spezifiziert nicht, dass wir Sprachproben ausgeben müssen. Dürfen wir einfach zehnmal piepen?
John Dvorak

@ PeterTaylor: Wenn Sie ihre Größe als Teil Ihrer Punktzahl zählen, ist es OK. Ich war nur besorgt, dass es ein System geben könnte, in dessen Standard-Laufzeitumgebung Audiobeispiele von Ziffern vergraben sind.
Ilmari Karonen

3
Da es einen stetigen Strom von Leuten zu geben scheint, die die Frage nicht bis zum Ende durchlesen und unbedeutende Umschläge in schwergewichtigen Bibliotheken veröffentlichen, könnte es sich lohnen, den Aspekt "Do it yourself" noch stärker in den Vordergrund zu rücken.
Peter Taylor

Antworten:


10

Ruby - 3710 = 90 Zeichen Code + 3620 Byte Daten

require'zlib'
$><<$*[0].chars.map{|x|Zlib::Inflate.inflate File.open(x).read}.join(?0*5e3)

Eingabe: Ein einzelnes Befehlszeilenargument, die zu lesende Zahl

Ausgabe: Rohtondaten, PCM 8bit / 8kHz

Hiermit kann eine beliebige Eingabezeichenfolge gelesen werden, solange

  • Es enthält nur Zeichen, die gültige Dateinamen sind. für nur vier Zeichen können Sie diesen Satz auf alle Zeichen vergrößern.
  • Sie haben die erforderlichen Dateien.
  • warum oh du Raum dee oh en Apostrophe tee Raum em i en dee Raum tee aitch i es Periode

5e3kodiert die Pause zwischen zwei Wörtern. Hier sind 5 effektivples ~ = 0,6s. Nach Belieben anpassen.

Jetzt ist es schwierig, die Beispieldateien in 4K zu bekommen und sie dennoch einfach und in ausreichender Qualität zu dekomprimieren. So habe ich sie bekommen:

  • Nehmen Sie eine Text-to-Speech-Engine, mit der Sie Audiodateien erstellen können. Wikipedia hat eine .
  • Geben Sie einen Text ein, der alle Ziffern enthält, im Idealfall nahe beieinander. ich benutzte http://en.wikipedia.org/wiki/Base_13 verwendet
  • Downsample.
  • Schneiden Sie jeden Part in einem Soundeditor aus .
  • Als Rohdatei speichern.
  • Dezimieren Sie jede Probe (verwerfen Sie niederwertige Bits).
  • Luft ablassen.

Nun muss man eine Abtastrate und einen Dezimierungsbetrag auswählen. Zu viel, und der Ton wird nicht verständlich. Zu wenig und du passt nicht. Ich habe mich für 8kHz / 3b entschieden. Dort sind sie: https://github.com/honnza/drops/raw/master/digits.zip

  • 8KHz * 4b / Sample und höhere Qualität - zu groß
  • 8KHz * 3b / Sample - niedrige Qualität, passt aber in 4K
  • 8KHz * 2b / sample - kch kchhhhhhhh [nicht verständlich]
  • 2KHz * 8b / Sample - zu groß
  • 2 KHz * 3b / Probe - kch kchhhhhhhh
  • 1 KHz * 8b / Probe - kch kchhhhhhhh

Hier ist das Dezimationsskript:

require'zlib'
Dir.glob "*.raw" do |fname|
  File.open fname[/\d/], "wb" do |out|
    File.open fname do |input|
      bytes = input.bytes.to_a
      bytes.map! {|x|x&0xE0}
      dfl = Zlib::Deflate.deflate(bytes.pack("C*"),9)
      dfl.each_byte do |byte|
        out.print byte.chr
      end
      puts "done #{fname}: #{dfl.size}"
    end
  end
end

Wie für die ursprüngliche Herausforderung: Es gibt 476 Bytes Platz für Code und die Dateitabelle. Dies kann etwas zu viel sein, je nachdem, wie klein wir mit einer DEFLATE-Bibliothek werden können. Wenn nötig, können wir hier und da ein paar Ecken abschneiden, indem wir die Audio-Samples etwas aggressiver zuschneiden. [fo:r]oder [o:]spielt keine Rolle, spart aber Bytes. Ich war ein bisschen gütig, als ich die Zahlen beschnitten habe. Ein anderes Dezimierungsschema oder das Verzichten auf eine Dezimierung für das Downsampling könnten ebenfalls hilfreich sein - ich werde später damit spielen. Durch das Löschen der DEFLATE-Header wird möglicherweise nur wenig Platz gespart.

Das Verketten von Sound-Samples ist recht einfach, 4K ist jedoch etwas beengt. Wenn Sie nicht an einen 4k-Raum gebunden sind, empfehle ich eine geringere Dezimierung. 4 Bits pro Sample schneiden eigentlich ganz gut ab und sind nur geringfügig größer.


+1, nicht schlecht. Die Klarheit ist jedoch ziemlich marginal: Ich habe versucht, ein paar Zufallszahlen zu transkribieren, und dabei eine Erfolgsquote von etwa 70% erzielt. (Ich hatte auf etwas näheres als 99% gehofft.) Ich bin auch immer noch ein bisschen am Zaun über die ehrenvolle Erwähnung: Sie haben zwar ein ziemlich gutes Argument vorgebracht, dass 4K auf diese Weise erreichbar sein könnte , aber nicht tatsächlich demonstriert. Selbst wenn Sie Ruby für C weggeworfen hätten (was einfach genug zu sein scheint; ich wäre bereit, diesen Teil im Glauben zu übernehmen), könnten Sie dann wirklich einen DEFLATE-Decoder in den verbleibenden Flash-Raum einbauen? Außerdem ist die Klangqualität, wie gesagt, ziemlich schlecht.
Ilmari Karonen

Ps. Ein paar Tipps zur besseren Komprimierung: Sie können alle Samples auf eine feste Länge mit Null-Bytes auffüllen (was eine gute Komprimierung bewirken sollte) und sie zu einer komprimierten Datei zusammenfassen, dekomprimieren und in Segmente aufteilen. Mit dem KZIP-Trick aus dieser Antwort können Sie außerdem die DEFLATE-Komprimierung verbessern. Versuchen Sie schließlich, die kombinierte Audiodatei zu bearbeiten, um die entsprechenden Phoneme durch exakte Kopien zu ersetzen.
Ilmari Karonen

naja, die original sound samples waren IMO auch nicht gerade verständlich - das downsampling hat dem wenig geschadet. Die kleinste DEFLATE-Bibliothek, die ich kenne - die erste, die mit Wikipeda verbunden ist - wiegt ungefähr 500 Milliarden. Ehrlich gesagt, soll ich den Inflater auf dieses spezielle Gerät portieren? Ich könnte es tatsächlich bekommen, aber ich habe noch nie zuvor für ARM codiert.
John Dvorak

Ich bin ziemlich überrascht über die Erfolgsquote von 70% - ich habe festgestellt, dass die Zahlen leicht zu verstehen sind. Welche Ziffern haben Sie am meisten verwechselt?
John Dvorak

Es auf einen Cortex M0 zu portieren ist wahrscheinlich ein bisschen zu viel verlangt (obwohl, wenn Sie das könnten, wäre das fantastisch!), Aber ich denke, dass eine eigenständige Binärdatei (+ Datendateien, falls vorhanden) darunter passt 4k scheint eine vernünftige Demonstration zu sein. (Keine statische Verknüpfung in libc für Datei-E / A erforderlich, da Sie dies auf einem eingebetteten Gerät nicht benötigen, aber der DEFLATE-Code sollte auf jeden Fall gezählt werden.) Grundsätzlich etwas, das Sie als Antwort auf die ursprüngliche Frage posten könnten auf electronics.SE und zuversichtlich sagen "Wenn Sie dies für Ihr Gerät kompilieren, wette ich, es wird passen".
Ilmari Karonen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.