Вдохновленный этим вопросом от electronics.SE , вот вам вызов:
Напишите программу или подпрограмму, которая принимает последовательность десятичных цифр (от 0 до 9) и произносит их вслух, без использования существующего инструмента синтеза речи.
Входные данные:
Вы можете запросить ввод цифр в любом приемлемом формате, например, в виде строки цифр ASCII, массива целых чисел, числа в кодировке BCD и т. Д. Если ваше решение представляет собой исполняемую программу, вы можете принять ввод как параметр командной строки, прочитать его из стандартного ввода или получить его любым другим разумным способом.
Ваша программа должна иметь возможность произносить не менее восьми цифр за вызов. Вы можете предположить, что первая цифра не ноль, если только это не единственная цифра.
Выход:
Ваша программа может либо озвучивать цифры напрямую, используя аудиоустройство, либо может выводить воспроизводимый звуковой файл. Выходной файл, если таковой имеется, может быть в любом стандартном аудиоформате или может состоять из необработанных образцов данных. Если вы выводите необработанные данные семплов, обратите внимание на соответствующие параметры для воспроизведения (частота дискретизации, биты на семпл, порядковый номер, знак / без знака, количество каналов). Форматы, поддерживаемые aplay, являются предпочтительными.
Вы можете сами выбирать детали того, как будут произноситься цифры, но ваш вывод должен состоять из цифр на английском языке, понятных обычному носителю английского языка , и он должен быть достаточно ясным, чтобы слушатель мог точно транскрибировать произнесенное восьмизначное случайное число. Нет, только звуковой сигнал n раз не считается. Не забудьте включить паузы между цифрами.
Подсчет очков:
Применяются стандартные правила подсчета кода для игры в гольф : ваш счет - это длина кода в байтах или, если код написан в тексте Unicode, в символах Unicode. Самый низкий балл побеждает. Любой язык идет.
Поскольку первоначальный вопрос об электронике. SE касался встроенного программирования, я счел, что было бы целесообразно бросить кость авторам, использующим языки низкого уровня: если ваше решение написано на скомпилированном языке, вы можете посчитать длину скомпилированный исполняемый файл в байтах как ваш счет. (Да, скомпилированный байт-код, такой как .class
файл Java , тоже в порядке.) Если вы решите использовать эту опцию, пожалуйста, включите копию скомпилированного исполняемого файла в ваш ответ (например, в виде шестнадцатеричного дампа) вместе с вашим исходным кодом и версия компилятора и опции, которые вы использовали для его генерации.
Похвальная , наряду с +50 повторения щедротами, будет предоставлены первым ответ , который также отвечает критериям первоначального вопроса , то есть способно работать на встроенный MCU с 4 кб вспышки и 1 кб SRAM.
Ограничения:
Вы не имеете права использовать какие-либо файлы или сетевые ресурсы , которые не являются частью стандартной среды выполнения выбранного вами языка, если вы не учитываете длину указанных файлов или ресурсов как часть вашей оценки. (Это запрещено, например, загружать аудио образцы из Интернета.)
Вы также не имеете права использовать какие-либо ранее существующие инструменты или библиотеки для синтеза речи или компиляции аудиоданных (если только вы не учитываете их размер как часть своей оценки), даже если они включены в стандартную среду выполнения выбранного языка.
Ответы:
ruby - 3710 = 90 символов кода + 3620 байтов данных
вход: один аргумент командной строки, число для чтения
выход: необработанные звуковые данные, PCM 8 бит / 8 кГц
Это может прочитать любую входную строку, пока
5e3
кодирует паузу между двумя словами. Здесь 5ksamples ~ = 0.6s. Твик по желанию.Теперь самое сложное - получить образцы файлов в формате 4K, но при этом иметь возможность распаковывать их легко и с достаточным качеством. Вот как я их получил:
Теперь нужно выбрать частоту дискретизации и количество прореживания. Слишком много, и звук не будет понятным. Слишком мало, и ты не подходит. Я остановился на 8 кГц / 3b. Вот они: https://github.com/honnza/drops/raw/master/digits.zip
Вот сценарий прореживания:
Что касается исходной задачи: для кода и таблицы файлов имеется 476 байт. Это может быть немного слишком много, в зависимости от того, насколько маленьким мы можем получить библиотеку DEFLATE. Если необходимо, мы можем срезать несколько углов здесь и там, обрезая аудио образцы более агрессивно.
[fo:r]
или[o:]
не имеет большого значения, но сохраняет байты. Я был несколько доброжелателен, когда подрезал цифры. Также может помочь другая схема децимации или пожертвование некоторой децимацией для понижающей дискретизации - я поиграюсь с этим позже. Кроме того, удаление заголовков DEFLATE может сэкономить немного места.Конкатенация звуковых сэмплов довольно проста, но 4K немного тесноват. Если вы не связаны 4k пробелом, я предлагаю меньше прореживания. 4 бита на выборку на самом деле довольно неплохие и только немного больше.
источник