Hlasové modemy pomocí vgetty

Martin Černý, xcerny@fi.muni.cz


Obsah


Co je to hlasový modem ?

Hlasový modem je běžný modem, který je navíc schopen přehrávat z počítače zvukové soubory a naopak nahrávat zvuky přicházející z telefonní linky do souboru na disk počítače. Dále rozpoznává tóny na lince jako oznamovací tón, obsazeno atd. a konečně rozpoznává i tzv. DTMF tóny (Dual Tone Modulation frequency). To jsou zvuky, které jsou vydávány telefoními přístroji při stisku nějaké klávesy.

Hlasový modem může fungovat jako prostý záznamník, ale díky schopnosti rozpoznávat DTMF tóny zvládne náročnejší aplikace.


Co je k tomu třeba ?

Nejprve je nutné nainstalovat vgetty. To se pro RedHat nachazí v rpm balíku mgetty-voice-1.1.21-4.i386.rpm. V něm se nachází i utilita vm, která umí mimo jiné přehrávat zaznamenané vzkazy a nové vzkazy nahrávat na disk. Všechny zvukové soubory mají příponu rmd (Raw Modem Data), což není žádný standartní formát, nýbrž nativní formát modemu. Pro konverzi mezi formáty slouží utility pvftools.

Jelikož software prožívá bouřlivý vývoj a autoři nestihli aktualizovat manuálové stránky, neobsahuje tento balik téměř žádnou dokumentaci. O trochu lepší je to s mgetty-1.1.21-4.src.rpm.


Konfigurace

Program vgetty je rozšíření programu mgetty. Soubor, ve kterém jsou volby nejen pro vgetty, ale i pro vm a pvftools je implicitně v /etc/mgetty+sendfax a má jméno voice.conf .

Některé volby:



Implicitní chování vgetty

Pokud není uvedeno žádné jméno skriptu v call_program, vgetty přijme hovor, přehraje zprávu ze souboru

$voice_dir / $message_dir / jmeno  ,
kde jmeno musí být uvedeno v souboru
$voice_dir / $message_dir / Index  .

Pak zazní signál a nahrává se vzkaz z tel. linky. Nahraný vzkaz se nachází v adresáři

$voice_dir / $recieve_dir
a má náhodné jméno. Pokud volající vysílá DTMF tóny, je volán skript uvedený v dfmt_program. Interface viz. voice.conf.


Voice shell

Pokud je uvedeno jméno skriptu v call_program, vgetty spustí tento program v příslušném shellu, nastaví mu roury VOICE_INPUT, VOICE_OUTPUT a další promněné. Skript je tak schopen zjišťovat stav modemu a ovládat ho.

Příklad skriptu: přehraje zprávu a zavěsí

#! /usr/bin/vm shell

#vrací stav modemu
function receive {
        read -r INPUT <&$VOICE_INPUT;
        echo "$INPUT";
}

#posílá příkaz voice shellu
function send {
        echo $1 >&$VOICE_OUTPUT;
        kill -PIPE $VOICE_PID;
}

ANSWER=`receive`
if [ "$ANSWER" != "HELLO SHELL" ]; then
        exit 1
if
send "HELLO VOICE PROGRAM"

ANSWER=`receive`;
if [ "$ANSWER" != "READY" ]; then
        exit 1
fi

send "PLAY /var/spool/voice/messages/greeting.rmd"

ANSWER=`receive`
if [ "$ANSWER" != "PLAYING" ]; then
        exit 1
fi

ANSWER=`receive`
if [ "$ANSWER" != "READY" ]; then
        exit 1
fi

send "GOODBYE"

ANSWER=`receive`
if [ "$ANSWER" != "GOODBYE SHELL"]; then
        exit 1
fi

exit 0

Některé příkazy a odpovědi voice shelu


Nejpoužívanější události:



Modem::Vgetty

Pro pohodlnější programování než jsou shellovské skripty nabízí Perlové rozhraní Modem::Vgetty. Příklady a popis jsou uvedeny v mgetty-1.1.21-4.src.rpm v adresáři voice/Perl