Пробуем оживить старый дисковый телефон. Продолжение
В прошлый раз (см. Пробуем оживить старый дисковый телефон) нам удалось связать несколько винтажных телефонов (одному из них в этом году исполнилось 50 лет) в одну сеть с помощью мини-АТС и звонить по ним. Но хотелось чего-то большего. Ведь первой идеей вообще было: поднимаешь трубку — и что-то там слышишь, даже если поблизости нет собеседников. Нужно было сделать что-то типа автоинформатора с заранее записанным, либо обновляющимся текстом сообщения. Проблема была в том, что с тем железом, которое у меня было, я сделать это не смог, не смотря на то, что в ход пошел даже голосовой модем и какой-то примитивный софт.
В итоге было принято решение действовать наверняка. Я нашел АТС, которая поддерживает и аналоговые телефоны, и VoIP:

Собираем все вместе и проверяем, работает ли аналоговая связь в новой кофигурации. Работает:

Параллельно на ноутбуке устанавливаем и настраиваем Asterisk — софтверную АТС, а также клиенты Linphone на двух смартфонах. Аналогично проводным телефонам все работает только в локальной сети, без выхода наружу.
Следующий этап — самый сложный: в «железной» АТС нужно настроить VoIP, правильно прописав настройки сервера Asterisk, тем самым объединив две системы. Интерфейс примерно как у самолета, но на второй вечер происходит чудо: звонок с проводного телефона идет на смартфон. И наоборот. Как оно работает, я до сих пор не понимаю.

Еще раз: мы соединили технологии, между которыми полвека. Аналоговый телефон и современный смартфон. Это же какая-то магия!
Но Asterisk хорош не только тем, что он умеет соединять телефоны. Он еще умеет воспроизводить звуковые файлы. Начинаем с простого. Настраиваем так, чтобы при звонке на номер 123 (этот номер неспроста: это номер порта, по которому работает сетевой протокол времени NTP, с помощью которого устаройства синхронизируют время через интернет) механический голос говорил нам текущее время. У Asterisk есть набор звуковых семплов: «один», «два», «часа», «часов», и он из них, как из кубиков собирает голосовое сообщение и передает его позвонившему.
Но только время — это как-то мало. А что если попробовать также погоду? Ведь раньше вроде были такие службы. А сейчас есть сайты, которые по API запросу отдают json-массив с метеоданными. Вот пример:
"current": {
"dt": 1788640127,
"sunrise": 1788576941,
"sunset": 1788624005,
"temp": 19.56,
"feels_like": 19.32,
"pressure": 1017,
"humidity": 67,
"dew_point": 13.27,
"uvi": 0,
"clouds": 3,
"visibility": 10000,
"wind_speed": 1.22,
"wind_deg": 228,
"wind_gust": 1.39,
"weather": [
{
"id": 800,
"main": "Clear",
"description": "ясно",
"icon": "01n"
}
]
},
Здесь можно найти всю необходимую информацию о текущей погоде: температура, влажность, давление, ветер, восход и заход солнца. Сохраняем все в переменные и подставляем в заготовку текста. Получается примерно так:
$publish = "Сегодня " . $description_today . ". Температура от " . $temp_min_today . " до " . $temp_max_today . " °. Ветер " . $wind_direction_name_today . " " . $wind_speed . " м/с, порывы " . $wind_gust . " м/с. Восход в " . $sunrise_time . ", закат в " . $sunset_time . ". Долгота дня " . $day_length_text . ". Сейчас на улице " . $temp_now . " °, влажность " . $humidity_now . " %, атмосферное давление " . $pressure_now_mm . " мм. Индекс ультрафиолета " . $uvi_level;
У нас есть текст и его нужно озвучить. Сначала я пользовался онлайн-инструментами. Они очень хороши тем, что умеют правильно склонять градуса / градусов, понимают, что м/с — это метры в секунду и знают, как работать с временем, например, что 16:21 — это «шестнадцать часов двадцать одна минута». При этом у них естественный, человеческий голос, параметры которого (например, скорость) можно настраивать. С помощью скрипта раз в 20 минут отправляем подготовленный текст и получаем звуковой файл, который передаем дальше, чуть подогнав битрейт, чтобы Asterisk смог его воспроизвести. Но очевидно, что при таком подходе генерируется лишний трафик — три раза в час загрузка звукового файла с внешних серверов. А я за минимализм. Почему бы не попробовать сценарий, когда мы запрашиваем только сырые погодные данные в текстовом массиве, а звук генерируем у себя сами?
Устанавливаем на домашнем сервере piper. Это так называемый софт TTS — Text-to-Speech. Возможно, есть варианты получше, но этот самый известный. Качаем для него голос. Пробуем. Тут, конечно, все уже более незамысловато: м/с — это «эмслэшэс», ° просто игнорируется, а про склонение можно забыть. Голос при этом звучит более механически, но возможно, это даже плюс для такого сценария. А шаблон текста можно вполне довести до ума, прописав вручную нужные склонения слов.
В итоге: набрав на диске номер 200 мы слышим текущую погоду и прогноз на день. Мы действительно заставили телефон заговорить.