Röstmodemkommandouppsättning

Ett röstmodem är ett analogt telefondatamodem med en inbyggd förmåga att sända och ta emot röstinspelningar över telefonlinjen . Röstmodem används för telefoni och telefonsvarare . I likhet med Hayes-kommandouppsättningen som används för datamodem, där värddatorn styr modemet via en serie kommandon som kallas AT-kommandon , finns det en väldefinierad uppsättning vanliga röst-AT-kommandon som är något konsekventa i hela branschen.

Implementeringsproblem

Eftersom röstläge inte är den vanliga användningen för ett modem, har många modem på marknaden dåligt eller buggigt stöd för sina röstlägen. Egenskaperna hos ett bra röstmodem beror mycket på den avsedda applikationen och inkluderar:

  • Pålitlig drift. Många modem "låser" helt enkelt eller kraschar värddatorn, även om detta är vanligare med Winmodem . Andra har buggar för flödeskontroll och andra implementeringsbuggar, vilket kan orsaka att samtal hänger sig, ljud hoppar över eller ljud fortsätter att spelas upp efter ett försök att avbryta.
  • Bra ljudegenskaper. Vissa modem har en okorrigerbart låg signalvolym eller producerar ljudbrus. Vissa modem kan inte känna igen alla utom de bästa DTMF- signalerna. Vissa modem gör ett dåligt jobb med att spela in, eller upptäcka och rapportera tystnad eller omkastning av spänningsslutet, som vissa applikationer behöver.
  • Stöd för nummerpresentation vid behov. "Typ 1 nummerpresentation" som används i Nordamerika saknas i de allra flesta modem. Nästan alla modemkretsuppsättningar stöder nummerpresentation, men eftersom den typiska uppringda Internetanvändaren inte behöver nummerpresentation, utelämnas ofta de extra komponenter som behövs för att stödja nummerpresentation av kostnadsskäl.
  • Stöd för flera instanser. Drivrutinerna för många interna modem (vanligtvis Winmodem) kan inte tolerera mer än en av samma enhet inuti en enda dator. Symtom på inkompatibilitet inkluderar krascher, blå skärmar av dödsfall eller enkel inoperabilitet av alla utom ett enda modem. Externa RS-232 -baserade (seriella) modem har inte denna begränsning eftersom varje modem innehåller sin egen mikroprocessor och är omedveten om andra modem på samma värd. USB- modem kan ha eller inte ha detta problem, eftersom vissa USB-modem helt enkelt är seriemodem med en "USB-till-seriell"-omvandlarkretsuppsättning (i vilket fall det inte borde vara några problem), och andra USB-modem är "värdstyrda" och är i huvudsak externt anslutna Winmodem (i vilket fall problemet kan kvarstå).

Plus kontra Hash

Varje röstmodemplattform tenderar att stödja antingen en av två uppsättningar röstkommandon – i synnerhet innehåller en variant av kommandouppsättningen ett plustecken (+) och den andra innehåller ett hash-tecken (#).

Detekterar röstläge

Stöd för röstläge kan upptäckas på ett modem genom att utfärda följande kommando: AT+FCLASS=?

Detta kommando stöds vanligtvis som innehåller plustecknet oavsett om ett modem stöder "plus" eller "hash" kommandouppsättningen, eftersom kommandot (som står för "fax class") är en del av industristandardens faxkommandon som alltid använder plus .

En röst som stöder modem kommer att svara med en kommaavgränsad lista med nummer som inkluderar siffran 8. Ett modem som inte stöder röst kommer att svara med ERROR , eller med en lista med nummer som inte inkluderar 8. (Många modem kommer att rapportera 0,1,2 indikerar stöd för data (0) och fax av klass 1 och 2 – detta är en indikation på att röststöd inte finns.)

Modem som stöder kommandouppsättningen "hash" svarar vanligtvis på AT#CLS=? också.

Går in i röstläge

Kommandot AT+FCLASS=8 eller AT#CLS=8 sätter modemet i röstläge. De flesta modem ligger fortfarande på luren och svarar med OK . När detta kommando har accepterats kommer de flesta modem att svara med Data Link Escape- meddelanden (DLE) istället för eller utöver vanliga modemsvar. Till exempel, istället för att rapportera en telefonlinje som ringer med RING- meddelandet, kommer många modem istället att skicka DLE ASCII -tecknet, följt av bokstaven R. Den specifika uppsättningen av DLE-händelser som rapporteras av varje modem är specifik för dess chipset och dokumenterad i dess referens guide.

Frågar modemets funktioner

Kommandot AT+VLS=? eller AT#VLS=? returnerar vanligtvis en lista över driftslägen som är specifika för varje modem. Vart och ett av dessa numrerade lägen bestämmer telefonlinjens status som luren på eller luren av, såväl som ljuddirigering mellan var och en av följande:

  • Inspelning/uppspelning
  • Telefonlur
  • Högtalartelefonuttag (som helt enkelt kan kopplas fast som en ljudingång på datorns ljudkort istället för att vara ett diskret uttag)
  • Mikrofonuttag (tillgängligt på vissa röstmodem)

Många chipset erbjuder en lista över alla möjliga kombinationer av lägen även om det specifika modemkortet inte stöder dem alla. Det beror på att korttillverkaren nästan alltid skiljer sig från chipsettillverkaren, och chipsetet kommer förkonfigurerat för att stödja all möjlig hårdvara, även om den inte är implementerad på kretskortet.

Exempel på svar på AT+VLS=? från ett modem på marknaden 2006:

AT+VLS=? 0,"",0000000000,0000000000,B084008000 1,"T",0B8418E000,0FE418E000,0B8419E000 2,"L",0884008000,0CE400880400,0CE400880001,018804001,018080001,018080001", 0,0FE418E000,0B8419E000 4,"S",0084008000 ,0484008000,3084018000 5,"ST",0B8418E000,0FE418E000,0B8419E000 6,"M",0084008000,04E4008000,3084004000,04008000,3084004000,0400408000,04E70408000,04E7040000000000000000000 ,0B8419E000 8,"S1",0084008000,0484008000,3084018000 9, "S1T",0B8418E000,0FE418E000,0B8419E000 10,"MS1T",0B8418E000,0FE418E000,0B8419E000 11,"M1",0084008000,804E,0084008000,804E,010M T",0B8418E000,0FE418E000,0B8419E000 14,"H",0084008000, 04E4008000,3084018000 15,"HT",0B8418E000,0FE418E000,0B8419E000 16,"MS",0084008000,04E4008000,30840178000",04E4018000",04E4018000",04E 000,3084018000 19,"M1S1",0084008000,04E4008000,3084018000 20," t",0B8418E000,0FE418E000,BB8419E000

Även om alla modem är olika, betyder vanligtvis läge 0 att luren på (lagt på) och läge 1 räcker för att lyfta telefonen, spela in/spela upp ljud och upptäcka DTMF ( pektoner ).

Kommandot AT+VSM=? eller AT#VSM=? returnerar vanligtvis en lista över ljuddataformat som stöds av modemet. Varje format innehåller ett namn (som PCM , ADPCM , μ-law , A-law ), ett antal bitar per sampel (vanligtvis 2, 3, 4, 8 eller 16) och en ljudsamplingsfrekvens (vanligtvis 7 200, 8 000 eller 11 025 Hertz ). Dessa är branschstandardiserade ljudkodekar vars implementeringar är väl publicerade. ADPCM-standarden är ett undantag. Modem som påstår sig stödja ADPCM stöder nästan alltid Dialogic ADPCM , även känd som "VOX", som är liknande men inte kompatibel med andra ADPCM-implementeringar, inklusive Interactive Multimedia Association (IMA) ADPCM samt MS ADPCM (en Microsoft-implementation som används i WAV - filer ). Modem kan också stödja dessa, om en kvalificerare är listad – annars betyder ADPCM som standard Dialogic.

Exempel på svar på AT+VSM=? från ett modem på marknaden 2006:

AT+VSM=? 1,"UNSIGNED PCM",8,0,8000,0,0 129,"IMA ADPCM",4,0,8000,0,0 130,"UNSIGNED PCM",8,0,8000,0,0 140, "2 Bit ADPCM",2,0,8000, 141,"4 Bit ADPCM",4,0,8000,0,0

Det önskade ljuddataformatet väljs med samma kommando men med ett nummer istället för ett frågetecken. Den används för både att skicka och ta emot.

Besvara samtal

Att besvara samtal görs vanligtvis med antingen AT+VLS=n- eller AT#VLS=n- kommandona, där n är ett tal som representerar modemets läge. För de allra flesta modem kommer detta nummer att vara 1 för att svara på ett telefonsamtal och 0 för att lägga på; andra nummer aktiverar andra funktioner när de finns, till exempel högtalartelefon. Vissa modem svarar som svar på ATA – standardsvarskommandot för dataläge – men andra modem kommer att tolka detta som ett kommando att faktiskt svara i data- och inte röstläge.

Överför ljuddata

För att börja sända ljuddata skickar värden kommandot AT+VTX eller AT#VTX . Detta resulterar i ett svar från modemet till CONNECT eller VCON . (Modem som använder "plus"-kommandouppsättningen svarar vanligtvis CONNECT, medan de som använder "hash"-uppsättningen svarar VCON, som står för voice connect.)

Från och med då tolkar modemet all data som skickas från datorn som vågljuddata, med hjälp av den codec som väljs av kommandot AT+VSM eller AT#VSM.

Ljuddata skickas alltid till modemet något snabbare än det kan spela upp det, så modemet kan buffra en liten del av det och spela det smidigt utan klick eller pop som orsakas av förseningar i datorns operativsystem. Till exempel, under uppspelning av en 8 kHz ljudfil med 8-bitars upplösning (som skapar 8 000 byte, eller 80 000 bitar när det inkluderar start/stopp-bitar, per sekund), måste data färdas över den seriella porten med minst 115 200 bitar per sekund. (115 200 bit/s är den första inställningen för en typisk seriell datorport som är större än 80 000.) Dessutom, på grund av extra overhead som är involverad i att dubbla DLE-byte i strömmen (nämns nedan), är en liten mängd extra bandbredd obligatoriskt att tillåta detta.

När modemet vill att datorn tillfälligt ska pausas så att uppspelningen kan komma ikapp, sänker det tillfälligt CTS-signalen (Clear to Send) på RS-232-porten. Modemet återhöjer signalen i tid för att datorn ska kunna återuppta sändningen av ljuddata innan uppspelningsbufferten blir helt tom.

När datorn vill signalera slutet på ljuddata, förväntar sig de flesta modem att se ett ASCII DLE-tecken (0x10), följt av ! karaktär.

Eftersom DLE-byten kan och ofta förekommer i normal ljuddata, måste den skickas två gånger till modemet när den ska tolkas som en byte med ljuddata.

De flesta modem accepterar också en sekvens av DLE + CAN (avbryt) som en signal för att avbryta ljuduppspelning. Skillnaden är att modemet ska förstå att det ska avbryta uppspelningen omedelbart nu, snarare än att låta återstående data i uppspelningsbufferten köras till slut.

När modemet är klart svarar det OK .

Strypande uppspelning

Under uppspelning är det nödvändigt att skicka ljuddata med en hastighet som gör att ljudet spelas upp smidigt, men utan att skicka det snabbare än modemet kan hantera det. Det är också önskvärt att se till att modemet alltid kan avbryta uppspelningen och kassera eventuellt buffrat ljud om ett meddelande ska avbrytas. Avbokning av meddelanden förväntas av uppringare som redan känner till svaren på röstmeddelanden och ger sitt svar tidigt (och som skulle bli irriterade över att tvingas lyssna på en uppmaning de redan har svarat på).

Det finns flera sätt att hålla datorn som skickar ljuddata till modemet i en takt för att hålla jämna steg med uppspelningen utan att överköra ljudbufferten.

Det enklaste är att använda CTS flödeskontroll. Följande varningar finns.

  • Vissa röstmodem har buggar i implementeringen av flödeskontroll. I synnerhet kommer ett stort antal Conexant- kretsuppsättningar ibland att tappa sin CTS-linje och aldrig ta upp den igen under uppspelning. Conexant är en enormt populär styrkrets i röstmodem idag och de implementerar annars röstkommandon bra, vilket gör det värt att överväga att komma runt denna bugg. Vissa Conexant-kretsuppsättningar kommer inte heller att ta tillbaka CTS om kommandot "avbryt uppspelning" skickas eller bearbetas av modemet medan CTS är nere.
  • Vissa röstmodem erbjuder en mycket stor sändningsbuffert (till exempel 4 sekunders ljud) tillsammans med en bugg som hindrar värden från att begära en "avbryt uppspelning". Resultatet är att om en uppringare trycker på en touchton som ska avbryta ett meddelande, och värden tillhandahåller obegränsad ljuddata som förmedlas av CTS enbart, blir slutresultatet att meddelandet inte kan avbrytas på minst 4 sekunder.

Ett andra sätt att strypa uppspelningen involverar polling av en "tick"-timer som tillhandahålls av värddatorns operativsystem och baserat på en hårdvaruklocka som är oberoende av värdens CPU-belastning. Detta kan eller kanske inte är tillgängligt, och det beror helt på värdoperativsystemet. Men när den är tillgänglig är den extremt pålitlig. Det är rimligt att anta att datorn behöver ligga före uppspelningen med ett par hundra byte och att modemet kommer att buffra detta. (Kommandona AT+VBQ eller AT#VBQ på röstmodem avslöjar ofta buffertens storlek i byte, och 1 till 2 kilobyte är ett typiskt svar.)

Ett tredje sätt att strypa uppspelningen involverar att infoga dummy DLE -meddelanden i utgångsströmmen så att ljuddata tar en känd tid att sända genom den seriella porten, och uppspelningen klockas i huvudsak av UART i serieporten.

Till exempel, när du överväger att använda dummy DLE-stoppning, måste några saker först noteras. I ett typiskt scenario kan en sekunds ljud vara 8 000 enbytessampel, och med en liten procentandel av samplen som är lika med DLE-byten och måste fördubblas, kan en typisk sekunds ljud vara 8 050 byte. Tricket innebär att infoga tillräckligt med meningslösa DLE-meddelanden i byte som modemet kommer att kassera (det vill säga en DLE följt av en byte utan någon specifik betydelse) så att det finns exakt 11 520 byte (förutsatt att en serieport låst vid 115 200 bit/s) vilket tar exakt 1 sekund att sända genom serieporten. Även om det är möjligt att avbrottslatens på värddatorn kan orsaka att något mindre än 11 ​​520 byte skickas per sekund, kommer de flesta röstmodem att buffra tillräckligt med byte innan uppspelningen faktiskt startar för att tillåta en liten skevhet här. Datorn kan också programmeras att konvertera en sekund ljud till något mindre än 11 ​​520 byte (alla röstmodem kommer att buffra en liten överskridning utan behov av flödeskontroll så länge det inte är mer än några hundra byte).

Dummy DLE-stoppning fungerar sannolikt inte med "Winmodem" som inte har någon fysisk UART. Det är bara vettigt med externa seriella modem som är fysiskt klockade till en specifik bithastighet av en klockgenerator bakom den externa seriella porten.

Spela in ljuddata

Metoden för att spela in ljuddata är densamma, förutom att kommandot är AT+VRX , eller AT#VRX , och modemet sänder ljuddata medan datorn tar emot det. RTS/CTS-flödeskontroll används inte här (datorn måste acceptera all ljuddata den tar emot, och modemet stimulerar automatiskt sin överföring för att matcha ljudsamplingsfrekvensen).

Modemet slutar aldrig sända förrän datorn säger åt det att sluta, vilket vanligtvis är med CTRL-C. Datan avslutas alltid med DLE+!, och alla DLE-bytes som naturligt förekommer i strömmen skickas två gånger för att skilja dem från vanliga DLE-meddelanden.

Före, under och efter inspelning kan modemet meddela datorvärden om specifika händelser inklusive, men inte begränsat till, följande:

  • Tangenttryckningar har upptäckts
  • Tystnad har upptäckts
  • Linjepolaritetsomkastning har upptäckts (betyder ofta att den som ringer lägger på)
  • Kopplingston har upptäckts
  • Faxton har upptäckts

När modemet vill berätta för värden om dessa, skickar det en DLE-byte, plus ett (vanligtvis) 1-byte-meddelande som beskriver händelsen. Listan över händelser som stöds varierar beroende på modem, men vanligtvis betyder en siffra (liksom * och #) trycktoner och bokstaven "s" betyder att tystnad har upptäckts. Vissa modem rapporterar endast en händelse för varje knapptryckning, medan andra rapporterar en knapptryckning upprepade gånger tills tangenten släpps, och sedan en speciell "knapp släppt"-händelse.

Avsluta ett röstsamtal

Något av följande kommandon gör vanligtvis att modemet lägger på och avslutar ett röstsamtal: AT+VLS=0 , AT#VLS=0 , ATH , ATZ . Att släppa RS-232 DTR- signalen (dataterminal redo) åstadkommer ofta detta också. Modemet förblir i röstläge (förutom i fallet med ATZ).

Röstmodem lägger inte på automatiskt även när den som ringer i andra änden gör det. De kan rapportera avbrott, uppringning eller tystnadshändelser, men det är upp till datorn att agera efter dem. Om uppringaren lägger på luren när modemet spelar in och datorn inte reagerar, fortsätter modemet att spela in allt annat som hörs på linjen, som kopplingstoner, felmeddelanden från telefonbolaget och så vidare.

Se även

  • AT kommandoreferenshandbok för Rockwell, Conexant och Lucent chipset. (Varje chipsettillverkare producerar en manual med samma titel, följt av namnet på produkten som den gäller)
  • Zoom Tech Support Documentation, AT Command References
  • International Telecommunication Union (februari 1998), Styrning av röstrelaterade funktioner i en DCE med en asynkron DTE , Serie V: Datakommunikation över telefonnätet: Kontrollprocedurer, International Telecommunication Union, ITU-T Rekommendation V.253
  • Mirho, Charles (augusti 1996), "För att lära dig mer om röstmodemtillägg för Windows 95, tryck 1 nu!" , Microsoft Systems Journal , Hayes AT-standarden hjälpte till att främja utbredd acceptans av datamodem eftersom program bara kunde skicka rätt AT-mumla-det här och AT-mumla-det, och alla modem som talar AT-standarden kommer att veta vad de ska göra. En liknande standard, AT+V, verkar ha dykt upp även för röstmodem. AT+V-kommandouppsättningen består av Hayes AT-kommandon med prefix och +V-prefixerade röstkommandon. AT+V är dokumenterad som ANSI/TIA/EIA-standard IS-101 med titeln "Fax Digital Interfaces-Voice Control Interim Standard for Asynchronous DCE." En uppföljning av denna specifikation är PN-3131 av TIA Technical Subcommittee TR-29.2.