Промовте цифри від 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.