Український сервер UA SvxReflector

Інформація, підключення... Посилання: SVX.GREENWAVE.ORG.UA

Автор Тема: Linux + SvxLink => Многоцелевая Система Голосовых Услуг для Радиолюбителя  (Прочитано 15079 раз)

0 Користувачів і 2 Гостей дивляться цю тему.

Offline SkyLine

SvxLink Концепция:
Проект SvxLink создан Тобиасом (SM0SVX) в 2002 году и с тех пор постоянно развивается.
Проект SvxLink разрабатывает гибкую, систему голосовых услуг общего назначения для использования радиолюбителями.
SvxLink - состоит из ядра, которое обрабатывает соединение с приемопередатчиком.
Ядро может быть сконфигурировано для работы в качестве контроллера репитера или работать на симплексном канале.
При помощи основной или основных подпрограмм так называемой - Логики, которые могут быть объединены.
В этом случае каждая логика имеет различное назначение.
EchoLink является лишь одним из многих модулей, таким образом, SvxLink - значительно отличается от классического EchoLink.
Он не ограничивается работой Отдельных Рипитеров / ​​Симплексных Линков, но теоретически можно настроить любое количество Репитеров / ​​Линков, которые работают самостоятельно. На рисунке проиллюстрирован принцип работы:

 

Если компьютер поддерживает звуковую карту, то стерео-канал можно использовать отдельно, т.е. левый канал контролирует 70см - репитер,
правый канал 23см-репитер, и оба конечно, работают самостоятельно. Пределы только, устанавливаются производительностью компьютера.
Каждый слой реализованный в системе обработки событий SvxLink. В каждом возможном случае, например, открытия или закрытия шумоподавителя, входящее соединение EchoLink, ... TCL-Функция называется, в которой SvxLink-Сисоп может настроить свои собственные процедуры.
Этот интерфейс, по сути похож на VisualBasic-расширения в EchoLinkPlus, но предлагает гораздо больше функциональных возможностей.

Голосовые услуги загружены в ядро ​​как плагины или модули, как их называют в SvxLink.
Примеры существующих голосовых услуг (Модулей):
Help - Справочная система.
Parrot- Попугай (модуль, который воспроизводит все, что вы говорите).
EchoLink - Подключение к другим EchoLink станциям.
TclVoiceMail - Простая система голосовой почты.
DtmfRepeater - DTMF ретранслятор (воспроизводит набранные вами DTMF команды, сам при этом на них не реагирует).
MetarInfo - Погодный модуль (озвучивает метеосводки по аэропортам).
PropagationMonitor - Монитор прохождения (озвучивает информацию о условия прохождения полученную с GoodDX.net).
SelCallEnc - Модуль селективного вызова (отправляет выборочную последовательность тональных сигналов).

Проект также включает в себя: Qtel - Простой Qt EchoLink Клиент для пользователя.
"Фичи" данного Клиента:
Многопоточность. Возможность подключения к нескольким станциям одновременно, не смешивая аудио потоки, не создавая "петли".
Подключение к станции по IP-адресу.
Установка любой кодировки в чате.
Скриншот Qtel:

Продолжение следует...
« Останнє редагування: Січень 20, 2021, 15:31:59 від UT5UKA »
 
Користувачі, які подякували цьому постові: UT4ULP, UT5UKA

Offline SkyLine

Цитата: "laser" post=26214
можна в двох словах різницю між рефлектор, репітер, симплекс і нетлогік?

Reflector - "Кімната, конференція" - ПЗ, для з'єднання в одну мережу (-і), окремих Репітерів чи Вузлів.
ReflectorLogic - Логіка, для взаємодії з Reflector.
RepeaterLogic - Логіка, для використання в Репітеному режимі - окремі TX та RX.
SimplexLogic - Логіка, для використання на Вузловому режимі- один, загальний, TRX.
NetLogic - Логіка, для використання в Інтернет-Радіо подовжувачі, Рупітера чи Вузла.


Цитата: "laser" post=26214
яким чином логічно організувати мережу з 3 і більше вузлів одного чи різних рівнів (всі репітери чи всі симплексні радіо, чи так і сяк.) ?

Reflector - "Кімната, конференція" - ПЗ, для з'єднання в одну мережу (-і), окремих Репітерів чи Вузлів.
Чи Так, чи Сяк - як завгодно, це як Вам зручно та потрібно.


Цитата: "laser" post=26214
чому remotetrx виділений в окремий застосунок?

Для зручності. Далеко не всім він потрібен.


Цитата: "laser" post=26214
p.s. пакет дуже цікавий, але з хелпами туго. функцій більше ніж відповідей в інтернеті =(

Відповіді, знайдете тут:
https://github.com/sm0svx/svxlink/wiki
https://groups.io/g/svxlink
https://svxlink.de
https://www.facebook.com/groups/1497393903846836/
 

Offline koval

Увага, а тепер дуже цікаве запитання. Як сконфігурити SvxLink таким чином щоб можна було нажиматися на ptt навіть при відкритому шумодаві?
 

Offline SkyLine

Цитата: "koval" post=26238
Як сконфігурити SvxLink таким чином щоб можна було нажиматися на ptt навіть при відкритому шумодаві?
Будь-ласка, трохи докладніше. Бо не зрозуміло...
Що Ви хочете досягти?

 - Задіяти RepeaterLogic, замість SimplexLogic.
 - Задіяти SimplexLogic-2 на іншому каналі (частоті).
 

Offline laser

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

по суті так - треба ставити дві рації в фулл дуплекс режимі...
 

Offline koval

Ось ще цікава розробка іспанського аматора
https://github.com/dh1tw/remoteAudio
 

Offline sirrosh

  • Hero Member
  • *****
  • Повідомлень: 714
  • Karma: +5/-0
Интересно, что:
Цитувати
remoteAudio is written in Go.

... ох уж эти двадцатилетние смузихлебы *SUICIDE*

P.S.: Немецкий, вроде?
 

Offline koval

Вроді Німець. Але живе в Іспанії. Якось так. Ну і GoLang це вам не PHP з JavaScript'ом завернуте в Node.JS. Але це так, ІМХО.  
Там в нього цікава розробка. Він транспортом використовував спочатку MQTT, а потім перейшов до NATS.
 

Offline SkyLine

Україномовний, голосовий Метео-Інформер для SvxLink (і не тільки)...
Приклад його роботи, Ви можете почути в прикріпленому нижче аудіо-файлі.
Мову та все інше, легко адаптувати під Ваші потреби.
Скрипт має багато закоментованих строк, які бажано-би почистити..
Проте, так буде зручніше для кращого розуміння чи відладки.
Попередження: Все що Ви робите, здійснюється виключно на Ваш страх та ризик.
Протестовано під Debian OS v.9.7
Публікується під GPL v.3

Spoiler for Hiden:
Реєструєтесь на сайті Dark Sky - щоб отримати ID розробника, для доступу до API сайту:
https://darksky.net/dev/register

Інсталюємо залежності:
Код: [Select]
apt-get install curl jq sox libsox-fmt-mp3

Створюєте теку "weatherinfo", для нових аудіо-файлів:
/var/spool/svxlink/weatherinfo/

Ствоюєте файл "weatherinfo.sh", та робите його виконуваним:
/etc/svxlink/weatherinfo.sh
Код: [Select]

#!/bin/bash
# $ ./weatherinfo.sh weatherinfo.conf
# Gets the current conditions from the Forecast.io (DarkSky) API
# Pulls the JSON apart using 'jq' and dumps the temperature and
# humidity values out.
# https://github.com/smeek/darksky
# https://darksky.net/dev/register
#
# Adapted SkyLine, June 2018.
#

#
# Check dependencies
#
if ! command -v curl >/dev/null 2>&1; then
    echo "\\"cURL\\" is required but not installed; try \\"apt-get install curl\\" and try again. Abort."
    exit 1
fi

if ! command -v jq >/dev/null 2>&1; then
    echo "\\"jq\\" is required but not installed; try \\"apt-get install jq\\" and try again. Abort."
    exit 1
fi

if ! command -v sox >/dev/null 2>&1; then
    echo "\\"SoX\\" is required but not installed; try \\"apt-get install sox libsox-fmt-mp3\\" and try again. Abort."
    exit 1
fi

#
# Helper Functions
#
function strip_quotes {
    tmp=$1
    tmp="${tmp%\\"}"
    tmp="${tmp#\\"}"
    echo $tmp
}

#
# Parse the config file
# {
#     "latitude": , /* 44.8860 */
#     "longitude": , /* 36.0961 */
#     "apiKey": , /* 052cadd53fc0f5665554f0154444a003 */
#     "language": , /* uk */
#     "units": /* si */
# }
#
CONFIG_FILE=$1
#echo "Config. File: $CONFIG_FILE"
if [ "$CONFIG_FILE" = "" ]; then
    echo "Configuration file not specified. Abort."
    exit 2
fi

CONFIG=$(cat $CONFIG_FILE)
#echo "Config.: $CONFIG"
LAT=$(echo $CONFIG | jq '.latitude')
LONG=$(echo $CONFIG | jq '.longitude')
#echo "Lat./Long.: $LAT,$LONG"
API_KEY=$(echo $CONFIG | jq '.apiKey')
API_KEY=$(strip_quotes $API_KEY)
#echo "API Key: $API_KEY"
LANG=$(echo $CONFIG | jq '.language')
LANG=$(strip_quotes $LANG)
#echo "Language: $LANG"
UNITS=$(echo $CONFIG | jq '.units')
UNITS=$(strip_quotes $UNITS)
#echo "Units: $UNITS"

#
# Query the API
#
API_URI=https://api.darksky.net/forecast
RSP=`curl -sS "${API_URI}/${API_KEY}/${LAT},${LONG}?lang=${LANG}&units=${UNITS}&exclude=minutely,daily,alerts"`
#echo "Response: $RSP"
CURRENTLY=$(echo $RSP | jq '.currently')
HOURLY=$(echo $RSP | jq '.hourly')
#echo "Currently: $CURRENTLY"
#echo "Hourly: $HOURLY"
SUMMARY=$(echo $CURRENTLY | jq -r '.summary')
TEMPERATURE0=$(echo $CURRENTLY | jq -r '.temperature' )
TEMPERATURE=$(echo $TEMPERATURE0 | awk '{printf "%.0f\\n",$1}')
HUMIDITY0=$(echo $CURRENTLY | jq -r '.humidity')
HUMIDITY=$(echo $HUMIDITY0*100 | bc | awk '{printf "%.0f\\n",$1}')
PRESSURE0=$(echo $CURRENTLY | jq -r '.pressure')
#Тиск перетворений в "мм" та обчислений "Барометричною Формулою", при 95м. над рівнем моря
#Потрібно зкоригувати під ваші умови...
PRESSURE=$(echo $PRESSURE0*0.750064*'e((-0.029*9.81*95)/(8.31*('$TEMPERATURE0'+273)))' | bc -l | awk '{printf "%.0f\\n",$1}')

WindBearing=$(echo $CURRENTLY | jq -r '.windBearing')
WindSpeed=$(echo $CURRENTLY | jq -r '.windSpeed' | awk '{printf "%.0f\\n",$1}')
WindGust=$(echo $CURRENTLY | jq -r '.windGust' | awk '{printf "%.0f\\n",$1}')

CurrentTime=$(echo $CURRENTLY | jq -r '.time')

SUMMARY3=$(echo "$HOURLY" | jq -r '.data[3].summary')
TEMPERATURE3=$(echo "$HOURLY" | jq -r '.data[3].temperature' | awk '{printf "%.0f\\n",$1}')
WindSpeed3=$(echo $HOURLY | jq -r '.data[3].windSpeed' | awk '{printf "%.0f\\n",$1}')

RSPTIZ=$(echo "$RSP" | jq -r '.timezone')
CurrentUnixTime=$(echo "$RSP" | jq -r '.currently.time')
CurrentTime=$(TZ=$RSPTIZ date --date="@$CurrentUnixTime" '+%H %M')

#
# Розрахунок напрямку вітра
#
if [[ "${WindBearing:0:1}" != [0-9] ]]; then
: # ignore NA wind direction
elif [[ "${WindBearing}" -ge 23 && "${WindBearing}" -le 67 ]]; then
WindBearing=$(echo північно-східний)
elif [[ "${WindBearing}" -ge 68 && "${WindBearing}" -le 112 ]]; then
WindBearing=$(echo східний)
elif [[ "${WindBearing}" -ge 113 && "${WindBearing}" -le 157 ]]; then
WindBearing=$(echo південно-східний)
elif [[ "${WindBearing}" -ge 158 && "${WindBearing}" -le 202 ]]; then
WindBearing=$(echo південний)
elif [[ "${WindBearing}" -ge 203 && "${WindBearing}" -le 247 ]]; then
WindBearing=$(echo південно-західний)
elif [[ "${WindBearing}" -ge 248 && "${WindBearing}" -le 292 ]]; then
WindBearing=$(echo західний)
elif [[ "${WindBearing}" -ge 293 && "${WindBearing}" -le 337 ]]; then
WindBearing=$(echo північно-західний)
else
WindBearing=$(echo північний)
fi

#echo "CurrentUnixTime: $CurrentUnixTime"
#echo "CurrentTime: $CurrentTime"
#echo "Summary: $SUMMARY"
#echo "Temperature: $TEMPERATURE°C"
#echo "Pressure: $PRESSUREмм"
#echo "Humidity: $HUMIDITY%"
#echo "WindBearing: $WindBearing"
#echo "WindSpeed: $WindSpeedм/с"
#echo "WindGust: $WindGustм/с"
#cho "Summary3: $SUMMARY3"
#echo "Temperature3: $TEMPERATURE3°C"
#echo "WindSpeed3: $WindSpeed3м/с"

WeatherCurrent=$(echo Станом на $CurrentTime в місті Запоріжжя: $SUMMARY, температу́ра-$TEMPERATURE° при атмосферному тиску-$PRESSUREмм, і вологості-$HUMIDITY%, вітер $WindBearing $WindSpeedм/с.)
Weather3=$(echo В найближчі 3 години: $SUMMARY3, температу́ра-$TEMPERATURE3°, вітер $WindSpeed3м/с.)
AudioDir=/var/spool/svxlink/weatherinfo
#echo "WeatherCurrent: $WeatherCurrent"
#echo "Weather3: $Weather3"
#echo "AudioDir: $AudioDir"

sleep 2
wget -q -U Mozilla -O $AudioDir/WeatherCurrent.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$WeatherCurrent&tl=uk"
wget -q -U Mozilla -O $AudioDir/Weather3.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$Weather3&tl=uk"
sox $AudioDir/WeatherCurrent.mp3 $AudioDir/Weather3.mp3 -r16000 -esigned-integer -b16 -c1 $AudioDir/weather.wav tempo 1.1

#mpg123 $AudioDir/WeatherCurrent.mp3
#mpg123 $AudioDir/Weather3.mp3


Створюєте конфігураційний файл "weatherinfo.conf":
/etc/svxlink/weatherinfo.conf
Записуємо координати вашого міста (вузла SvxLink) та ID розробника Dark Sky.
Код: [Select]

{
    "latitude": **.******,
    "longitude": **.******,
    "apiKey": "Ваш_ID_DarkSky",
    "language": "uk",
    "units": "si"
}


Cron запускає виконання скрипта на 25-тій та 55-тій хвилині, кожної години.
/etc/crontab
Код: [Select]

# m h dom mon dow user command
25 *    * * *   root /etc/svxlink/weatherinfo.sh /etc/svxlink/weatherinfo.conf
55 *    * * *   root /etc/svxlink/weatherinfo.sh /etc/svxlink/weatherinfo.conf


Копіюєте файл: Logic.tcl
/usr/share/svxlink/events.d/Logic.tcl
До теки: "local/"
/usr/share/svxlink/events.d/local/Logic.tcl
Якщо такої не ще існує, то створюєте її.

/usr/share/svxlink/events.d/local/Logic.tcl
Знаходите у файлі Logic.tcl, відповідні строки...
Та додаєте ще 2:
playFile "/var/spool/svxlink/weatherinfo/weather.wav";
playSilence 500;
Як зазначено, нижче:
Код: [Select]

#
# Executed when a long identification (e.g. hourly) should be sent
#   hour    - The hour on which this identification occur
#   minute  - The hour on which this identification occur
#
proc send_long_ident {hour minute} {
  global mycall;
  global loaded_modules;
  global active_module;
  variable CFG_TYPE;

  spellWord $mycall;
  if {$CFG_TYPE == "Repeater"} {
    playMsg "Core" "repeater";
  }
  playSilence 500;

  playMsg "Core" "the_time_is";
  playSilence 100;
  playTime $hour $minute;
  playSilence 500;
  playFile "/var/spool/svxlink/weatherinfo/weather.wav";
  playSilence 500;


Фідбек - вітається!  ;-)  ;-)  ;-)
 

Offline laser

шикарно! обов'язково спробую в себе, але трохи пізніше.
зараз творчий застой - до техніки не підходжу...

цікаво також чи сильно протиратиме крон ВАВ-файлом флешку...? хоча при теперішній вартості їх можна міняти хоть щорічно.

ЖИРНЕ ВАМ ДЯКУЮ за скрипт  *FAN*
 

Offline SkyLine

Цитата: "laser" post=26343
зараз творчий застой - до техніки не підходжу...

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

Результат - в прикріпленому файлі. Поки ще, на стадії відладки.
Дані прогнозу, беруться з сайту: Метео-Нова.
Цікаво буде промоніторити, довготермінову похибку в прогнозах...

Нажаль, не знайшлося можливості зістикувати бутерброд "перекладач-вінда"...
Тому, прийшлось робити все в Linux.  :-)

Spoiler for Hiden:
https://www.meteonova.ua
Этой ночью ожидается пасмурная погода, температура 0..+2°. Атмосферное давление в пределах нормы. Утром - небольшой дождь. Завтра днем переменная облачность, +5..+7°, ветер юго-восточный, умеренный. Атмосферное давление в пределах нормы. Геомагнитное поле спокойное.
31-го января, в течение суток ожидается переменная облачность; ночью -1..+1°, днем +5..+7°, ветер юго-восточный, умеренный.
Прогноз погоды обновлен 2 часа 46 минут назад
 

Offline laser

мене ще цікавить можливість "читання" поточних метеоданих зі своєї домашньої метеостанції. імпортуючи дані через JSON чи щось таке.
поле для експериментів є  *IDEA*

п.с. в аудіозаписі вийшло  "помірний атмосферний тиск"  :-D короче в TTS туго з пунктуацією трохи. шкода україномовні движки практично ніхто не розвиває у нас =(
 

Offline SA7BOA

Цитата: "sirrosh" post=26254
Интересно, что:

remoteAudio is written in Go.


Офигеть!  *PRANKSTER*
 

Offline SkyLine

Україномовний, голосовий Метео-Інформер для SvxLink (і не тільки).. v.2.0
Метео-Інформер, озвучує прогноз, погоди наданий сайтом "Метеонова"
Приклад його роботи, Ви можете почути в прикріпленому нижче аудіо-файлі.
Попередження: Все що Ви робите, здійснюється виключно на Ваш страх та ризик.
Протестовано під Debian OS v.9.7
Публікується під GPL v.3

Spoiler for Hiden:
Інсталюємо залежності:
Код: [Select]
apt-get install curl translate-shell sox libsox-fmt-mp3

Інші "маніпуляції", ідентичні тим, що описані кількома постами вище.

Створюєте файл "weatherinfo.sh", та робите його виконуваним:
/etc/svxlink/weatherinfo.sh

Код: [Select]

#!/bin/bash
#
# Україномовний метео-інформер
# Прогноз погоди, взято з сайту Метеонова https://www.meteonova.ua/
#
# SkyLine, January 2019
#

# Код Вашого міста з адресного рядка сайту "Метеонова"
CITY_ID="34601"

# Тека для аудіо-файлів
AudioDir=/var/spool/svxlink/weatherinfo

# Завантаження даних прогнозу
URI_INP=`curl -sS https://www.meteonova.ua/frc/${CITY_ID}.htm \\
| iconv -f cp1251 -t utf8 | grep 'id="frc_text_0"' | sed -e 's||:|g'`

# Обробка 1-го рядка
Out_1=$(echo $URI_INP | sed -e 's/[^:]*:\\([^:]*\\).*/\\1/' -e 's|<[^>]*>||g' \\
| trans -b ru:uk | sed -e 's| °|°|g' -e 's|помірний|поміірний|g' -e 's|+ |+|g' -e 's|м / с|м/с|g' -e 's| null||g')

# Обробка 2-го рядка
Out_2=$(echo $URI_INP | sed -e 's/[^:]*:[^:]*:\\([^:]*\\).*/\\1/' | sed -e 's|<[^>]*>||g' \\
| trans -b ru:uk | sed -e 's| °|°|g' -e 's|помірний|поміірний|g' -e 's|+ |+|g' -e 's|м / с|м/с|g' -e 's| null||g')

# Обробка 3-го рядка
Out_3=$(echo $URI_INP | sed -e 's/[^:]*:[^:]*:[^:]*:\\([^:]*\\).*/\\1/' | sed -e 's|<[^>]*>||g' \\
| trans -b ru:uk | sed -e 's| °|°|g' -e 's|помірний|поміірний|g' -e 's|+ |+|g' -e 's|м / с|м/с|g' -e 's| null||g')

# Відладка результатів обробки
#echo "Input: $URI_INP"
#echo
#echo "Output_1: $Out_1"
#echo "Output_2: $Out_2"
#echo "Output_3: $Out_3"

sleep 2

# Створення та обробка аудіо-файлів
wget -q -U Mozilla -O $AudioDir/Out_1.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$Out_1&tl=uk"
wget -q -U Mozilla -O $AudioDir/Out_2.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$Out_2&tl=uk"
wget -q -U Mozilla -O $AudioDir/Out_3.mp3 "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$Out_3&tl=uk"

#sox $AudioDir/Out_1.mp3 $AudioDir/Out_2.mp3 -r16000 -esigned-integer -b16 -c1 $AudioDir/weather.wav tempo 1.0
sox $AudioDir/Out_1.mp3 $AudioDir/Out_2.mp3 $AudioDir/Out_3.mp3 -r16000 -esigned-integer -b16 -c1 $AudioDir/weather.wav tempo 1.0
 

Offline SkyLine

Цитата: "laser" post=26345
мене ще цікавить можливість "читання" поточних метеоданих зі своєї домашньої метеостанції. імпортуючи дані через JSON чи щось таке.
В першому скрипті, це і робиться. При допомозі утіліти: "jq".


Цитата: "laser" post=26345
п.с. в аудіозаписі вийшло  "помірний атмосферний тиск"  :-D короче в TTS туго з пунктуацією трохи. шкода україномовні движки практично ніхто не розвиває у нас =(

Ні. Звучало так: ".. вітер південно-східний, помірний." "Атмосферний тиск в межах норми."

Щоб звучало краще, то треба ще створювати окремий словник з коректною вимовою та наголосами.
Але, це вже інша, довга, історія. "Сриптик вище", був написаний за вечір та за кілька, протестований.
Ще є такий TTS: "Анатоль". :)
 

Offline laser

Цитувати
Ні. Звучало так:
- це писало так. а звучало саме як "помірний тиск". ну як мінімум я так почув.
тому і написав. не дивлячись що там крапка між реченнями, прозвучало якось на одному диханні.
хоча в самому браузері надиктовує ніби правильно, з паузами.
думаю легко пофіксити вставленням ще якихось символів (пробіл/абзац/кома/тире тощо)
не бачу потреби щось сильно ускладнювати. і так чудово все виходить  *THUMBS UP*