- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -

LinuxovΘ noviny 07/98

HlasovΘ modemy a jejich pou╛itφ

Jan Kasprzak, 17. Φervence 1998

S modemem jste se jist∞ ji╛ setkali. Asynchronnφ modem je za°φzenφ, kterΘ je schopno p°enß╣et data po telefonnφ lince nebo po metalickΘm okruhu (analogovß pevnß linka). Jist∞ jste si takΘ v╣imli, ╛e n∞kterΘ modemy majφ n∞kde u svΘ specifikace p°ipsanΘ slovo Voice. A prßv∞ o t∞chto modemech je Φlßnek, kter² prßv∞ Φtete.

Co je hlasov² modem?

Jde o zcela b∞╛n² modem, urΦen² pro komunikaci nad telefonnφ linkou. Mß rozhranφ pro p°ipojenφ k telefonnφ sφti a rozhranφ pro p°ipojenφ k poΦφtaΦi, obvykle RS--232. Hlasov² modem mß oproti b∞╛nΘmu modemu schopnost p°ehrßvat do telefonnφ linky digitßlnφ zvukov² signßl, kter² dostane z poΦφtaΦe, a naopak poΦφtaΦi p°edßvat digitalizovan² zvuk, kter² "sly╣φ" v telefonnφ lince. V∞t╣ina hlasov²ch modem∙ mß takΘ schopnost tento zvuk do jistΘ mφry analyzovat - nap°φklad detekovat ticho na lince, vyzvßn∞cφ a obsazovacφ t≤ny, a takΘ rozpoznßvat DTMF (Dual Tone Modulation Frequency) t≤ny. To je to pφpßnφ, kterΘ vydßvß klßvesnice v╣ech nov∞j╣φch telefonnφch p°φstroj∙ p°i vytßΦenφ Φφsla. V∞t╣ina hlasov²ch modem∙ mß takΘ vlastnφ reproduktor a konektor pro p°ipojenφ sluchßtek a mikrofonu.

K Φemu je hlasov² modem?

Asi nejzßkladn∞j╣φ a nejjednodu╣╣φ aplikacφ hlasovΘho modemu je emulace telefonnφho zßznamnφku. P°i p°φchozφm volßnφ software rozpoznß, jde-li o datovΘ (p°φpadn∞ faxovΘ) volßnφ, nebo dovolal-li se Φlov∞k. V poslednφm jmenovanΘm p°φpad∞ pak do telefonu p°ehraje zprßvu pro volajφcφ a umo╛nφ ulo╛it hlasov² vzkaz.

Pokud si ale uv∞domφme, ╛e pomocφ klßves t≤novΘ volby m∙╛e volajφcφ urΦit²m pom∞rn∞ dob°e definovan²m zp∙sobem p°edßvat hlasovΘmu modemu informaci, zjistφme, ╛e mo╛nosti jsou daleko v∞t╣φ. M∙╛eme pak vytvß°et i daleko rozsßhlej╣φ aplikace. Jedna z mo╛nostφ je vylep╣it nß╣ telefonnφ zßznamnφk tak, aby po zadßnφ ΦφselnΘho "hesla" pomocφ t≤novΘ volby umo╛nil p°ehrßt ulo╛enΘ zprßvy nebo zm∞nit zprßvu pro volajφcφ. Takto se zßznamnφkem m∙╛eme komunikovat i v p°φpad∞, ╛e nejsme u svΘho poΦφtaΦe. V dal╣φm popφ╣u problΘm, kter² jsem °e╣il pomocφ hlasov²ch modem∙ (a Linuxu, samoz°ejm∞), a dßle uvedu prost°edky, kterΘ jsem k °e╣enφ pou╛il.

P°ijφmacφ zkou╣ky

Stejn∞ jako u v╣ech vysok²ch ╣kol, konajφ se i na Fakult∞ informatiky p°ijφmacφ zkou╣ky do prvnφho roΦnφku. CelΘ p°ijφmacφ °φzenφ konΦφ tφm, ╛e uchazeΦ napφ╣e test, ten n∞kdo opravφ (v p°φpad∞ FI je╣t∞ tent²╛ den), p°iΦtou se body za st°ednφ ╣kolu, r∙znΘ olympißdy a podobn∞, uchazeΦi se set°φdφ podle dosa╛enΘho poΦtu bod∙, v urΦitΘm mφst∞ se ud∞lß Φßra odd∞lujφcφ p°ijatΘ a nep°ijatΘ uchazeΦe, vytiskne se oznßmenφ o v²sledku °φzenφ a roze╣le se uchazeΦ∙m (no, trochu jsem to zjednodu╣il, ale zhruba to takto probφhß). UchazeΦ tedy mß n∞kolikadennφ dobu, po kterou Φekß na v²sledek zkou╣ky. ProblΘm je ten, ╛e ne ka╛d² uchazeΦ (nebo jeho rodiΦe) vydr╛φ Φekat a╛ do pφsemnΘho oznßmenφ. Zam∞stnankyn∞ studijnφho odd∞lenφ pak po n∞kolik dnφ ned∞lajφ nic jinΘho, ne╛ zodpovφdßnφ dotaz∙ na to, jak ten kter² budoucφ gΘnius (:-) dopadl.

Rozhodli jsme se, ╛e studijnφmu odd∞lenφ situaci trochu ulehΦφme. V²sledky zve°ej≥ujeme jednak p°es WWW, a jednak pomocφ hlasov²ch modem∙. UchazeΦi u╛ u p°ijφmacφ zkou╣ky dostanou letßk s informacφ, na jakΘ telefonnφ Φφslo mohou zavolat, a jak²m zp∙sobem se tam po╛adovanou informaci dov∞dφ.

Rozhovor s poΦφtaΦem

Cel² systΘm je °e╣en² tak, ╛e u╛ivatel zavolß na danΘ Φφslo, a usly╣φ toto:

Dobr² den.
Dovolali jste se na hlasov² server Fakulty informatiky.
Stiskn∞te tlaΦφtko "0" na svΘm telefonu.

Po╛adavek na stisk tlaΦφtka nula slou╛φ jednak k tomu, abychom detekovali volajφcφ, jejich╛ telefon nepodporuje t≤novou (DTMF) volbu, a jednak proto, ╛e na dal╣φch k≤dech pak m∙╛eme v budoucnu zavΘst i jinΘ slu╛by, ne╛ jen sd∞lovßnφ v²sledk∙ p°ijφmacφch zkou╣ek.

Stiskl-li uchazeΦ ·sp∞╣n∞ tlaΦφtko nula, systΘm pokraΦoval dßle:

Zadejte vß╣ identifikaΦnφ k≤d a stiskn∞te k°φ╛ek.

UchazeΦ zadal Φφseln² identifikaΦnφ k≤d a stiskl tlaΦφtko #. K≤dy se uchazeΦi dov∞d∞li p°i p°ijφmacφ zkou╣ce. K≤d sestßval z ╣estimφstnΘho identifikaΦnφho Φφsla, pou╛itΘho pro tohoto uchazeΦe i ve studijnφ databßzi, a t°φ nßhodn∞ vygenerovan²ch Φφslic, kterΘ slou╛ily jednak jako heslo, a jednak m∞ly snφ╛it mo╛nost toho, ╛e n∞kdo omylem vyslechne v²sledek n∞koho jinΘho a vyvodφ z toho pro sebe nesprßvnΘ zßv∞ry. TlaΦφtko # slou╛ilo jako ukonΦovacφ znak pro sekvenci Φφslic. Tento zp∙sob zadßvßnφ Φφsla zamezφ tomu, ╛e u╛ivatel a systΘm budou na sebe navzßjem Φekat, pokud u╛ivatel stiskne o jedno tlaΦφtko mΘn∞ nebo systΘm n∞kter² t≤n nerozpoznß.

Pokud uchazeΦ zadal chybn² k≤d (nap°φklad 1234#, systΘm odpov∞d∞l:

Neplatn² k≤d Φφslo jedna dva t°i Φty°i.
Zadejte vß╣ identifikaΦnφ ...

Zadal-li u╛ivatel chybn² k≤d (nebo nezadal-li k≤d) t°ikrßt, systΘm ukonΦil spojenφ. Pokud zadal platn² k≤d, systΘm jej p°eΦetl a oznamoval v²sledky. N∞kolik p°φklad∙ zde uvßdφm:

UchazeΦ s identifikaΦnφm Φφslem jedna dva t°i Φty°i se nedostavil k p°ijφmacφ zkou╣ce.
UchazeΦ s identifikaΦnφm Φφslem jedna dva t°i Φty°i zφskal sto dev∞t bod∙ za pφsemnou p°ijφmacφ zkou╣ku, p∞t bod∙ za st°ednφ ╣kolu, celkem sto Φtrnßct bod∙, a tedy nebyl p°ijat ke studiu. K p°ijetφ bylo pot°eba aspo≥ sto sedmdesßt bod∙.
UchazeΦ s identifikaΦnφm Φφslem jedna dva t°i Φty°i zφskal devadesßt bod∙ za obor v²poΦetnφ technika, sto dvacet t°i bod∙ za obor fyzika, patnßct bod∙ za st°ednφ ╣kolu, celkem dv∞st∞ dvacet osm bod∙, a tedy byl p°ijat ke studiu. K p°ijetφ bylo pot°eba aspo≥ dv∞st∞ deset bod∙.

Prvnφ p°φklad ukazuje n∞koho, kdo ani ke zkou╣ce nep°i╣el, druh² je uchazeΦ na odbornΘ studium, kter² nebyl p°ijat, a t°etφ je uchazeΦ na uΦitelstvφ v²poΦetnφ technika-fyzika, kter² byl p°ijat.

Na konci rozhovoru se systΘm rozlouΦil a zav∞sil:

D∞kujeme za zavolßnφ.

Pozd∞ji jsme systΘm je╣t∞ modifikovali pro pou╛itφ k p°ijφmacφm zkou╣kßm na Ekonomicko-sprßvnφ fakultu MU. Tam systΘm navφc °φkal inicißly jmen uchazeΦ∙, obory, na kterΘ byli p°ijati a po°adφ, na kterΘm se umφstili. Na druhΘ stran∞ ESF nepo╛adovala zabezpeΦenφ heslem, tak╛e jako vstupnφ k≤d slou╛ilo jen osobnφ Φφslo uchazeΦe.

Pou╛it² hardware

V dob∞ prvnφch test∙ asi p°ed p∙l rokem jsme pou╛φvali poΦφtaΦ s procesorem i486/66, 16MB pam∞ti a asi 250 MB disk. V dob∞ konßnφ zkou╣ek jsme u╛ m∞li Pentium 90 MHz a 32 MB RAM. Na tomtΘ╛ poΦφtaΦi ale neb∞╛ely jen hlasovΘ modemy - slou╛φ jako tiskov² server, faxov² server, jsou na n∞j p°es sΘriovΘ porty napojeny konzoly nejr∙zn∞j╣φch za°φzenφ a vykonßvß je╣t∞ n∞kolik dal╣φch slu╛eb. Moje zku╣enost je, ╛e na zßt∞╛i procesoru tΘto t°φdy se v∙bec neprojevilo, jestli b∞╛elo hlasovΘ spojenφ, nebo ne. A jak uvidφme dßle, s efektivitou obslu╛n²ch program∙ jsme se nijak neobt∞╛ovali - znaΦnß Φßst systΘmu je psßna v Perlu. Na kvalit∞ hlasovΘho spojenφ se takΘ nijak neprojevila p°φpadnß zßt∞╛ hlasovΘho serveru.

V poΦφtaΦi jsou dv∞ osmiportovΘ sΘriovΘ karty Cyclades Cyclom 8Yo, ka╛dß v cen∞ zhruba 11 500 KΦ. Moje zku╣enosti s tφmto hardwarem jsou ty nejlep╣φ. Driver pro Linux vypadß stabiln∞ a karty generujφ pom∞rn∞ malou zßt∞╛ systΘmu. Firma Cyclades dokonce uvßdφ Linux na prvnφm mφst∞ mezi podporovan²mi operaΦnφmi systΘmy. Narazil jsem jen na jedin² problΘm: driver pro tyto karty nefungoval, pokud byl kompilovßn p°ekladaΦem egcs. Tohle se dost t∞╛ko detekuje v p°φpad∞, ╛e jste si egcs nainstalovali n∞kdy p°ed p∙l rokem a u╛ ani nevφte, ╛e na svΘm poΦφtaΦi nemßte gcc.

Pro hlasovΘ aplikace jsme po°φdili ╣est modem∙. M∞l jsem se rozhodnout mezi US Robotics Sportster a ZyXEL Omni (s Rockwell chipem). Nakonec to vyhrßl Sportster - m∞l lep╣φ zvuk a fungoval lΘpe. Jako zajφmavost uvedu, ╛e ke Sportsteru dostanete sluchßtka, zatφmco k ZyXELu Omni v²robce (nebo prodejce?) dßvß malinkou lahviΦku J&B whisky... Modemy jsme napojili na mφstnφ telefonnφ ·st°ednu, kterß se ukßzala b²ti jedin²m slab╣φm Φlßnkem systΘmu. Ve ╣piΦce toti╛ vy°izovala a╛ dva hovory za sekundu, co╛ z°ejm∞ bylo vφc, ne╛ mohla unΘst. Toto bylo kritickΘ zejmΘna u zkou╣ek na FI, jejich╛ v²sledky byly zve°ejn∞ny je╣t∞ tent²╛ den. A tedy kolem oΦekßvanΘ hodiny zve°ejn∞nφ byl nßpor celkem velk². U zkou╣ek na ESF situace nebyla tak kritickß, proto╛e zve°ejn∞nφ bylo a╛ skoro t²den po vlastnφch zkou╣kßch, tak╛e se v╣ichni uchazeΦi nesna╛ili volat skoro p°esn∞ v tutΘ╛ hodinu.

Propustnost systΘmu je zhruba 150-200 hovor∙ za hodinu. Pr∙m∞rn² "rozhovor" trval zhruba dv∞ minuty, co╛ dßvß okolo 30 hovor∙ za hodinu na jeden modem.

Software

Jak se tedy pod Linuxem pracuje s hlasov²m modemem? Mo╛nostφ je n∞kolik. Mn∞ se nejvφc zalφbil program vgetty. Jde v podstat∞ o mgetty ftp://ftp.leo.org/pub/comp/os/unix/networking/mgetty/ s vestav∞n²mi hlasov²mi funkcemi. Tento balφk je distribuovßn v rßmci mgetty+sendfax jako dal╣φ dodateΦnß aplikace. Proto╛e mgetty je ╣piΦkou ve svΘm oboru, lze oΦekßvat, ╛e ani vgetty na tom nebude ╣patn∞. Ne╛ p°ejdu k popisu toho, jak se s vgetty pracuje, uvedu jen, ╛e zbytek systΘmu byl Red Hat Linux 5.0 a jßdro 2.0.34.

Program vgetty zaji╣╗uje (tΘm∞°) jednotn² p°φstup ke hlasov²m modem∙m, tak╛e odli╣nosti mezi jednotliv²mi typy modem∙ schovßvß. Program razφ my╣lenku "jednoduchΘ jednodu╣e, slo╛itΘ slo╛it∞ji" - sßm obsahuje jednoduch² hlasov² zßznamnφk, a pro slo╛it∞j╣φ problΘmy mß podporu skript∙.

Hlasov² shell

Komunikace vgetty s u╛ivatelskou aplikacφ probφhß pomocφ tzv. hlasovΘho shellu. To je program, jeho╛ jmΘno m∙╛eme nastavit v konfiguraΦnφm souboru voice.conf (na mΘm Red Hatu byl v adresß°i /etc/mgetty+sendfax/). V okam╛iku p°φchozφho volßnφ spustφ vgetty tento hlasov² shell, p°edß mu v prom∞nn²ch prost°edφ svoje PID (pou╛φvß se pak pro komunikaci), a dßle Φφsla dvou deskriptor∙. Tyto deskriptory ukazujφ na dv∞ roury, kterΘ slou╛φ k obousm∞rnΘ komunikaci mezi vgetty a hlasov²m shellem. Shell pak mß mo╛nost jednoduch²m znakov²m protokolem p°edßvat vgetty svoje p°φkazy ("p°ehrej tento soubor", "pφpni", "nahrej zvuky, kterΘ sly╣φ╣ z linky, do tohoto souboru", a tak podobn∞). Na druhou stranu vgetty p°edßvß shellu informace o stavu linky ("Sly╣φm DTMF t≤n #", "Na lince je ticho", "Sly╣φm obsazovacφ t≤n, volajφcφ asi zav∞sil", atd.). Tento protokol umo╛≥uje implementovat v╣e pot°ebnΘ pro hlasovΘ aplikace.

Perl na scΘn∞

Program vgetty obsahuje n∞kolik p°φklad∙ hlasov²ch shell∙ - vesm∞s jde o skripty v Bourne Shellu. Autor pφ╣e, ╛e mo╛nß n∞kdy bude podporovat i Perl. Proto╛e v Perlu se p°ece jen pφ╣e lΘpe ne╛ v shellu, rozhodl jsem se, ╛e p°echod na Perl trochu urychlφm. V dob∞ vydßnφ tohoto Φφsla Linuxov²ch novin by ji╛ m∞l b²t na CPANu ftp://ftp.fi.muni.cz/pub/perl/ dostupn² modul Modem::Vgetty, kter² je v²sledkem mΘ prßce. Hlavnφ k≤d je ji╛ stabilnφ, momentßln∞ dokonΦuji drobnΘ detaily jako je nap°φklad dokumentace.

Zmi≥ovan² modul je objektov∞ orientovanΘ, udßlostn∞ °φzenΘ rozhranφ k vgetty. Nejjednodu╣╣φ aplikaci, kterß p°ehraje zvukov² soubor volajφcφmu, m∙╛eme napsat t°eba takto:

  use Modem::Vgetty;
  my $v = new Modem::Vgetty;
  $v->play_and_wait('/cesta/soubor.rmd');
  exit 0;

Je vid∞t, ╛e se zde pou╛φvß jak²si soubor s koncovkou .rmd. Znamenß to Raw Modem Data a soubor obsahuje zvukovß data p°φmo pro konkrΘtnφ typ modemu. Toto je jedinΘ mφsto, kde vgetty neskr²vß p°ed u╛ivatelem typ modemu a kde aplikace musφ tento typ znßt. S programem vgetty se dodßvß i sada konverznφch program∙ se souhrnn²m nßzvem pvftools - zavßdφ portabilnφ textov² zvukov² formßt PVF (Portable Voice Format), p°es kter² se provßdφ konverze na jinΘ formßty. Tento p°φstup trochu p°ipomφnß balφk netpbm.

Dal╣φm p°φkladem m∙╛e b²t jednoduch² zßznamnφk: volajφcφmu se p°ehraje zprßva a mß mo╛nost ulo╛it sv∙j vzkaz.

  use Modem::Vgetty;
  my $v = new Modem::Vgetty;
  $v->add_handler('BUSY_TONE',
  	'konec', sub { $v->stop; exit 0; });
  $v->enable_events;
  $v->play_and_wait('/cesta/welcome.rmd');
  my $num = 0;
  $num++ while(-r "/cesta/$num.rmd");
  $v->record("/cesta/$num.rmd");
  sleep 30;
  $v->stop;
  exit 0;

Zde u╛ vidφme jednoduchΘ pou╛itφ udßlostφ. Modul poskytuje n∞kolik druh∙ udßlostφ. Jednou z nich je BUSY_TONE, kterß vznikß, detekuje-li modem na lince obsazovacφ t≤n. To je zejmΘna v p°φpad∞, kdy volajφcφ zav∞sil. Program na tuto udßlost reaguje tak, ╛e ukonΦφ svoji Φinnost. ╪et∞zec konec zde slou╛φ jen jako identifikace handleru pro danou udßlost, pokud bychom Φasem tento handler cht∞li zru╣it.

Zvukovß data

Pomocφ modulu Modem::Vgetty jsem implementoval cel² v²╣e popisovan² hlasov² systΘm. Vzhledem k tomu, ╛e nemßm uspokojiv∞ fungujφcφ systΘm pro syntΘzu °eΦi, rozhodl jsem se, ╛e cel² text namluvφm a rozd∞lφm na jednotlivß slova. Myslel jsem si, ╛e pro nasazenφ v praxi pak bude pou╛it n∞jak² p°φjemn² ╛ensk² hlas, ale nakonec tam z∙stal ten m∙j.

[ snd ]

Zvuky jsem vytvß°el za pomocφ mikrofonu, zvukovΘ karty Gravis Ultrasound MAX a programu snd http://www-ccrma.stanford.edu/CCRMA/Software/snd/snd.html. Tento program umo╛≥uje jak zaznamenßvat zvuky, tak pom∞rn∞ jednodu╣e tyto zvuky editovat. Tak nap°φklad jsem do jednoho souboru namluvil v╣echny mo╛nΘ i nemo╛nΘ Φφslovky, a pak jsem je pomocφ tohoto programu uklßdal po slovech do jednotliv²ch soubor∙. Je to nep°φli╣ zß╛ivnß prßce, jak si jist∞ umφte p°edstavit, zejmΘna u tak jednotvßrn²ch slov, jako jsou Φφslovky nebo jednotlivß pφsmena abecedy.

K Φφslovkßm jsem si je╣t∞ napsal dal╣φ modul (bude z°ejm∞ uvoln∞n jako Cz::Speak nebo Cz::Numbers). Tento modul umo╛nφ p°evΘst zadanΘ Φφslo na sekvenci Φesk²ch slov. Tedy Φφslo 1234 p°evede na Φty°i °et∞zce: "tisφc" "dv∞st∞" "t°icet" a "Φty°i". Je tam i n∞kolik roz╣φ°enφ - nap°φklad u╛ivatel m∙╛e specifikovat rod celΘho Φφsla (co╛ se projevφ pouze pokud je Φφslo rovno jednΘ nebo dv∞ma), nebo p°eΦφst Φφslo po trojicφch cifer, po dvojicφch cifer nebo i po jednotliv²ch cifrßch. TakΘ umφ p°eΦφst Φasov² interval a n∞kterΘ dal╣φ ΦφselnΘ ·daje.

Spoluprßce s databßzφ

Vzhledem k tomu, ╛e na projektu pracovalo vφce lidφ (jednou z Φßstφ bylo nap°φklad zve°ej≥ovßnφ v²sledk∙ p°es WWW), m∞li jsme jednotnΘ rozhranφ: databßzφ byly DBM soubory a rozhranφm byl program, kter² dostal jako parametr identifikaΦnφ k≤d uchazeΦe a vrßtil na v²stupu informace o neplatnΘm k≤du nebo o uchazeΦi.

Zßv∞r

Prokßzalo se, ╛e pro podobnΘ ·Φely je vgetty dostateΦn∞ mocn² prost°edek. SystΘm fungoval tΘm∞° bez v²padku a obslou╛il °ßdov∞ tisφc hovor∙, p°i kter²ch byl zadßn sprßvn² identifikaΦnφ k≤d (co╛ se poda°ilo volajφcφm zhruba v 70 procentech volßnφ) v p°φpad∞ zkou╣ek na FI, a zhruba t°i tisφce hovor∙ v p°φpad∞ ESF. U takov²chto v∞t╣φch akcφ se vyplatφ mφt k dispozici nßhradnφ stroj se stejn²m softwarem, aby v p°φpad∞ v²padku mohl b²t systΘm o╛iven pouhou v²m∞nou poΦφtaΦe. Toto jsme na╣t∞stφ m∞li, a tak v okam╛iku pßdu hlasovΘho serveru (dodnes uspokojiv∞ nevysv∞tleno), kdy do╣lo k po╣kozenφ ko°enovΘho adresß°e a ztrßt∞ vφce ne╛ poloviny soubor∙ na disku, jsme mohli b∞hem zhruba hodiny zapojit nßhradnφ poΦφtaΦ a v∞novat se restaurovßnφ p∙vodnφho poΦφtaΦe ze zßlohy (takΘ pravideln∞ zßlohujete, nenφ-li╛ pravda :-). Na druhΘ stran∞ tato technologie mß svΘ omezenφ. Asi nejv∞t╣φm z nich je nutnost manußlnφho namlouvßnφ hlasov²ch dat do poΦφtaΦe. V p°φpad∞ rozsßhlej╣φch systΘm∙ bychom pak narazili na problΘm, ╛e p°φpadnΘ ·pravy by musel mluvit tent²╛ Φlov∞k. Kdybychom m∞li rozumn∞ fungujφcφ syntΘzu °eΦi, byla by situace trochu jinß. *


- p°edchozφ Φlßnek - nßsledujφcφ Φlßnek - obsah - ·vodnφ strßnka -