Произнесите цифры от 0 до 9 вслух

15

Вдохновленный этим вопросом от electronics.SE , вот вам вызов:

Напишите программу или подпрограмму, которая принимает последовательность десятичных цифр (от 0 до 9) и произносит их вслух, без использования существующего инструмента синтеза речи.

Входные данные:

Вы можете запросить ввод цифр в любом приемлемом формате, например, в виде строки цифр ASCII, массива целых чисел, числа в кодировке BCD и т. Д. Если ваше решение представляет собой исполняемую программу, вы можете принять ввод как параметр командной строки, прочитать его из стандартного ввода или получить его любым другим разумным способом.

Ваша программа должна иметь возможность произносить не менее восьми цифр за вызов. Вы можете предположить, что первая цифра не ноль, если только это не единственная цифра.

Выход:

Ваша программа может либо озвучивать цифры напрямую, используя аудиоустройство, либо может выводить воспроизводимый звуковой файл. Выходной файл, если таковой имеется, может быть в любом стандартном аудиоформате или может состоять из необработанных образцов данных. Если вы выводите необработанные данные семплов, обратите внимание на соответствующие параметры для воспроизведения (частота дискретизации, биты на семпл, порядковый номер, знак / без знака, количество каналов). Форматы, поддерживаемые aplay, являются предпочтительными.

Вы можете сами выбирать детали того, как будут произноситься цифры, но ваш вывод должен состоять из цифр на английском языке, понятных обычному носителю английского языка , и он должен быть достаточно ясным, чтобы слушатель мог точно транскрибировать произнесенное восьмизначное случайное число. Нет, только звуковой сигнал n раз не считается. Не забудьте включить паузы между цифрами.

Подсчет очков:

Применяются стандартные правила подсчета : ваш счет - это длина кода в байтах или, если код написан в тексте Unicode, в символах Unicode. Самый низкий балл побеждает. Любой язык идет.

Поскольку первоначальный вопрос об электронике. SE касался встроенного программирования, я счел, что было бы целесообразно бросить кость авторам, использующим языки низкого уровня: если ваше решение написано на скомпилированном языке, вы можете посчитать длину скомпилированный исполняемый файл в байтах как ваш счет. (Да, скомпилированный байт-код, такой как .classфайл Java , тоже в порядке.) Если вы решите использовать эту опцию, пожалуйста, включите копию скомпилированного исполняемого файла в ваш ответ (например, в виде шестнадцатеричного дампа) вместе с вашим исходным кодом и версия компилятора и опции, которые вы использовали для его генерации.

Похвальная , наряду с +50 повторения щедротами, будет предоставлены первым ответ , который также отвечает критериям первоначального вопроса , то есть способно работать на встроенный MCU с 4 кб вспышки и 1 кб SRAM.

Ограничения:

Вы не имеете права использовать какие-либо файлы или сетевые ресурсы , которые не являются частью стандартной среды выполнения выбранного вами языка, если вы не учитываете длину указанных файлов или ресурсов как часть вашей оценки. (Это запрещено, например, загружать аудио образцы из Интернета.)

Вы также не имеете права использовать какие-либо ранее существующие инструменты или библиотеки для синтеза речи или компиляции аудиоданных (если только вы не учитываете их размер как часть своей оценки), даже если они включены в стандартную среду выполнения выбранного языка.

Илмари Каронен
источник
Ps. Я могу позже опубликовать собственное решение, если мне удастся заставить его произвести что-то, что действительно звучит понятно. Не стесняйтесь публиковать свои собственные, хотя; на данный момент, любой ответ является хорошим ответом.
Ильмари Каронен
1
Разрешено ли нам загружать базу данных произносимых цифр (и считать ее размер по отношению к партитуре) или мы должны записывать свой собственный голос? Я сомневаюсь, что могу генерировать образцы речи алгоритмически.
Джон Дворак
ммм ... секция "output" не указывает, что мы должны выводить образцы речи. Разрешено ли нам просто подавать звуковой сигнал десять раз?
Джон Дворак
@PeterTaylor: Если вы считаете их размер частью вашего счета, это нормально. Я просто волновался, что там может быть какая-то система, в которой аудио образцы цифр похоронены где-то в стандартной среде выполнения.
Ильмари Каронен
3
Поскольку, кажется, существует постоянный поток людей, которые не читают вопрос до конца и не публикуют тривиальные обертки вокруг тяжеловесных библиотек, возможно, стоит отредактировать, чтобы еще больше подчеркнуть аспект «Сделай сам».
Питер Тейлор

Ответы:

10

ruby - 3710 = 90 символов кода + 3620 байтов данных

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

вход: один аргумент командной строки, число для чтения

выход: необработанные звуковые данные, PCM 8 бит / 8 кГц

Это может прочитать любую входную строку, пока

  • он содержит только символы, которые являются допустимыми именами файлов. только для четырех символов вы можете увеличить этот набор для всех символов.
  • у вас есть необходимые файлы.
  • Почему вы занимаетесь пространством, апострофом или космосом?

5e3кодирует паузу между двумя словами. Здесь 5ksamples ~ = 0.6s. Твик по желанию.

Теперь самое сложное - получить образцы файлов в формате 4K, но при этом иметь возможность распаковывать их легко и с достаточным качеством. Вот как я их получил:

  • Возьмите механизм преобразования текста в речь, способный воспроизводить звуковые файлы. В Википедии есть один .
  • Поток это текст, содержащий все цифры, в идеале близко друг к другу. Я использовал http://en.wikipedia.org/wiki/Base_13
  • Downsample.
  • Вырежьте каждую часть в звуковом редакторе .
  • Сохранить как сырой файл.
  • Уничтожить каждый образец (отбросить младшие биты).
  • Выкачивает.

Теперь нужно выбрать частоту дискретизации и количество прореживания. Слишком много, и звук не будет понятным. Слишком мало, и ты не подходит. Я остановился на 8 кГц / 3b. Вот они: https://github.com/honnza/drops/raw/master/digits.zip

  • 8 кГц * 4b / образец и более высокое качество - слишком большой
  • 8 кГц * 3b / сэмпл - низкое качество, но вписывается в 4K
  • 8 кГц * 2b / образец - кч кчхххххххх [не понятно]
  • 2 кГц * 8b / образец - слишком большой
  • 2 кГц * 3b / сэмпл - кч кчхххххххх
  • 1 кГц * 8b / образец - кч кчхххххххх

Вот сценарий прореживания:

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

Что касается исходной задачи: для кода и таблицы файлов имеется 476 байт. Это может быть немного слишком много, в зависимости от того, насколько маленьким мы можем получить библиотеку DEFLATE. Если необходимо, мы можем срезать несколько углов здесь и там, обрезая аудио образцы более агрессивно. [fo:r]или [o:]не имеет большого значения, но сохраняет байты. Я был несколько доброжелателен, когда подрезал цифры. Также может помочь другая схема децимации или пожертвование некоторой децимацией для понижающей дискретизации - я поиграюсь с этим позже. Кроме того, удаление заголовков DEFLATE может сэкономить немного места.

Конкатенация звуковых сэмплов довольно проста, но 4K немного тесноват. Если вы не связаны 4k пробелом, я предлагаю меньше прореживания. 4 бита на выборку на самом деле довольно неплохие и только немного больше.

Джон дворак
источник
+1, неплохо. Однако ясность довольно незначительная: я попытался расшифровать несколько случайных чисел и добился примерно 70% успеха. (Я надеялся на что-то ближе к 99%.) Я также все еще немного нахожусь в стороне от вопроса о достойном упоминании: хотя вы привели довольно хороший аргумент, что 4K может быть достижимым таким образом, вы не на самом деле продемонстрировал это. Даже если бы вы отказались от рубина для C (что кажется достаточно легким делом; я хотел бы принять это участие на веру), не могли бы вы действительно разместить декодер DEFLATE в оставшемся пространстве флэш-памяти? Плюс, как я уже отметил, качество звука довольно плохое.
Ильмари Каронен
Ps. Несколько советов по лучшему сжатию: вы можете заполнить все выборки до фиксированной длины нулевыми байтами (которые должны хорошо сжиматься) и объединить их в один сжатый файл, затем распаковать и нарезать его. Кроме того, трюк KZIP из этого ответа может дать вам лучшее сжатие DEFLATE. Наконец, попробуйте отредактировать объединенный звуковой файл, чтобы заменить эквивалентные фонемы точными копиями.
Ильмари Каронен
ну, и исходные звуковые сэмплы тоже не совсем понятны - IMO - даунсэмплинг мало повредил этому. Самая маленькая из известных мне библиотек DEFLATE, первая из которых связана с wikipeda, весит около 500 байт. Честно говоря, вы хотите, чтобы я перенес инфлятор на это конкретное устройство? Я мог бы добраться до этого на самом деле, но я никогда не программировал для ARM раньше.
Джон Дворжак
Я очень удивлен 70% успеха - я нашел цифры, которые легко понять. Какие цифры вас больше всего смущают?
Джон Дворак
Портирование его к Cortex M0, вероятно, немного слишком много , чтобы спросить (хотя , если вы могли бы сделать это, это было бы здорово!), Но я думаю , что автономный двоичный (файлы + данные, если таковые имеются) фитинг Under 4k показалось бы разумной демонстрацией. (Нет необходимости статически ссылаться в libc для файлового ввода-вывода, так как это не понадобится на встроенном устройстве, но код DEFLATE, безусловно, должен учитываться.) По сути, то, что вы можете опубликовать как ответ на исходный вопрос на electronics.SE и с уверенностью сказать: «Если вы скомпилируете это для своего устройства, я уверен, что оно подойдет».
Ильмари Каронен