Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Говорящие часы

По причинам, далёким от рациональных, захотелось мне вчера сколхозить для себя говорилку времени. Простой вариант проговаривания цифр показался очень скучным, сразу вспомнились лебедевские часы «Вербариус», где одно и то же время каждый раз пишется по-разному.

На сайте «Студии Лебедева», в разделе часов «Вербариус» есть языковые файлы, три из которых — для русского, английского и французского выгружены в виде обычных экселевских таблиц. Их легко преобразовать в формат CSV при помощи приложения «Намберс» или всем знакомого «Экселя».

В получившемся файле много пустых полей и лишних пробельных символов, которые будут мешать, их легко удалить утилитой командной строки sed:

sed -i '' -E "s/; +| +;/;/g; s/;+/;/g; s/;[ "$'\r'"]*$//;" ~/Downloads/russian.csv

У получившегося файла очень простой формат — сначала идёт время без ведущего нуля, потом — варианты для произношения, разделённые точкой с запятой. На мой взгляд, для поиска нужной строки и выбора случайного вариант для произношения лучше всего подойдёт утилита awk.

Если направить её вывод маковской утилите say, то говорящие часы готовы:

awk -F\; "BEGIN{srand}/^$(date +%k:%M|xargs)/{print \$(int(2+rand*(NF-1))); exit;}" \
~/Downloads/russian.csv | xargs say

Я их пока вызываю из командной строки коротким алиасом t, но если понравится, настрою как службу, с вызовом через горячую клавишу.

2 комментария
hshhhhh.name 2020

Никогда не думал что они захардкодили фразы, я думал они как-то их генерируют на ходу. Но вариант с хардкодом надёжен, не считая что у них в русском примере поехало время и они этого не заметили:

13:59 Тринадцать часов пятьдесят девять минут
13:59 Четырнадцать часов ноль минут
...
23:58 Двадцать три часа пятьдесят девять минут

Евгений Степанищев 2020

Наблюдательность 80 уровня )

hshhhhh.name 2020

Наблюдательность 80 уровня )

чойта? я увидел что последняя строчка не сходится и пошёл смотреть где именно сломалось