Промовте цифри від 0 до 9 вголос


15

Натхненний цим питанням від electronics.SE , ось вам:

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

Вхід:

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

Програма повинна вміти говорити принаймні вісім цифр за виклик. Ви можете припустити, що перша цифра не дорівнює нулю, якщо тільки це не єдина цифра.

Вихід:

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

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

Оцінка:

Застосовуються стандартні правила зарахування : Ваш бал - це довжина коду в байтах або, якщо ваш код написаний у тексті Unicode, у символах Unicode. Виграє найнижчий рахунок. Будь-яка мова йде.

Оскільки в оригінальному запитанні на електроніці.SE говорилося про вбудоване програмування, я вважав, що було б доцільно кинути кістки авторам за допомогою мов низького рівня: якщо ваше рішення написано на компільованій мові, ви можете обрати підрахунок тривалості складений виконуваний файл у байтах як ваш рахунок. (Так, попередньо скомпільований байт-код, такий як .classфайл Java , також добре.) Якщо ви вирішили скористатися цим параметром, будь ласка, включіть у свою відповідь копію компільованого виконуваного файлу (наприклад, як шістнадцятковий дамп) разом із вихідним кодом і версію компілятора та параметри, які ви використовували для її створення.

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

Обмеження:

Ви не можете використовувати жодні файли та мережеві ресурси , які не входять до стандартного середовища виконання обраної вами мови, якщо ви не зараховуєте довжину цих файлів або ресурсів як частину вашої оцінки. (Це забороняється, наприклад, завантажувати зразки аудіо з Інтернету.)

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


Пс. Я можу опублікувати своє власне рішення пізніше, якщо мені вдасться змусити його створити щось, що насправді звучить зрозуміло. Не соромтеся публікувати свої власні; в цей момент будь-яка відповідь є гарною відповіддю.
— Ільмарі Каронен

1
Чи дозволяється нам завантажувати базу даних розмовних цифр (і рахувати її розмір у балах) чи ми маємо записати власний голос? Я сумніваюся, що можу генерувати зразки мовлення алгоритмічно.
— Джон Дворак

гмм ... розділ "вихід" не визначає, ми повинні виводити зразки мови. Чи дозволено нам десять разів просто подавати звуковий сигнал?
— Джон Дворак

@PeterTaylor: Якщо ви вважаєте їх розмір частиною вашої оцінки, це нормально. Я просто хвилювався, що там може бути якась система, яка має зразки аудіо цифр, закопаних десь у стандартному середовищі виконання.
— Ільмарі Каронен

3
Оскільки, здається, існує постійний потік людей, які не читають питання до кінця і розміщують тривіальні обгортки навколо важких бібліотек, можливо, варто редагувати, щоб ще більше акцентувати увагу на аспекті "Зроби сам".
— Пітер Тейлор

Відповіді:


10

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

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

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

вихід: вихідні звукові дані, PCM 8bit / 8kHz

Це може читати будь-який вхідний рядок, доки

  • він містить лише символи, які є дійсними іменами файлів. лише чотири символи можна збільшити, щоб встановити всі символи.
  • у вас є необхідні файли.
  • чому о, ви, космос де, о, апостроф, простір, і я, космос, простір, ай простір

5e3кодує паузу між двома словами. Тут 5проб ~ = 0,6с. Заправити за бажанням.

Тепер, найскладніша частина полягає в тому, щоб отримати зразкові файли в 4K і все ж мати можливість розпаковувати їх легко і в достатній якості. Ось як я їх отримав:

  • Візьміть програму Text-to-Speech, здатну створювати звукові файли. У Вікіпедії є така .
  • Подайте в нього текст, що містить усі цифри, в ідеалі близько один від одного. я використав http://en.wikipedia.org/wiki/Base_13
  • Німецький зразок.
  • Виріжте кожну частину в звуковому редакторі .
  • Збережіть як необроблений файл.
  • Розрахуйте кожен зразок (відкиньте біти низького порядку).
  • Спуску.

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

  • 8 кГц * 4b / зразок та вища якість - занадто великі
  • 8 кГц * 3b / зразок - низька якість, але він відповідає 4K
  • 8 кГц * 2b / зразок - kch kchhhhhhhhh [не зрозуміло]
  • 2 кГц * 8b / зразок - занадто великий
  • 2KHz * 3b / зразок - kch kchhhhhhhhhh
  • 1 КГц * 8b / зразок - kch kchhhhhhhhh

Ось сценарій децимації:

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 трохи тісно. Якщо ви не обмежені 4 к простором, я пропоную менше децимації. 4 біти на зразок реально спрацьовують непогано і лише трохи більше.


+1, непогано. Ясність досить незначна: я спробував переписати кілька випадкових чисел і отримав приблизно 70% успішності. (Я сподівався на щось наближене до 99%.) Я також ще трохи на огорожі про почесну річ: коли ви зробили досить хороший аргумент, що 4K можна досягти таким чином, у вас немає насправді це продемонстрували. Навіть якщо ви вибрали рубін для C (що здається досить простим; я хотів би взяти цю частину з вірою), чи могли б ви дійсно помістити DEFLATE декодер у залишковому флеш-просторі? Плюс, як я зазначав, якість звуку досить погана.
— Ільмарі Каронен

Пс. Кілька порад щодо кращого стиснення: Ви можете зв'язати всі зразки на фіксовану довжину з нульовими байтами (які повинні добре стискатись) і об'єднати їх в один стислий файл, а потім розпакувати і нарізати його. Крім того, хитрість KZIP з цієї відповіді може принести вам кращу стисненість. Нарешті, спробуйте відредагувати комбінований звуковий файл, щоб замінити еквівалентні фонеми точними копіями.
— Ільмарі Каронен

ну, оригінальні звукові зразки не були точно зрозумілими ні IMO - пониження потужності мало нанесло шкоди цьому. Найменша бібліотека DEFLATE, яку я знаю - перша, пов’язана з wikipeda - важить близько 500b. Відверто кажучи, ви хочете, щоб я наклав надувний на цьому конкретному пристрої? Я міг би дійти до цього насправді, але раніше ніколи не кодував ARM.
— Джон Дворак

Я дуже здивований 70% успішності - я знайшов цифри легко зрозуміти. Які цифри вас найбільше плутали?
— Джон Дворак

Перенесення його на Cortex M0, ймовірно, трохи забагато, щоб запитати (хоча, якби ви могли це зробити, це було б приголомшливо!), Але я думаю, що окремий бінарний (+ файли даних, якщо такі є) підходить під 4k може здатися розумною демонстрацією. (Немає необхідності статично посилатись у libc для вводу / виводу файлів, оскільки це вам не знадобиться на вбудованому пристрої, але код DEFLATE неодмінно слід рахувати.) В основному, щось, що ви можете опублікувати як відповідь на початкове запитання на електроніці.SE і впевнено скажіть, "якщо ви складете це для свого пристрою, я вважаю, що він підійде".
— Ільмарі Каронен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.