2012-05-15 5 views
2

좋아, 내 머리가 내게 단절되었습니다. 내가하려고하는 일은 컴퓨터가 너무 많은 링을 울린 후에 내 컴퓨터에 전화를 걸 수있는 프로그램을 작성하는 것입니다. 이 시점에서 나는 내 컴퓨터와 대화하고 컴퓨터 음성 인식 능력을 활용할 수있을 것이다. 그러나 내 컴퓨터는 전화를 통해 "마이크 입력"오디오 소스로 음성을 수신하지 못합니다. 아마도 COM4 포트가 모뎀이 릴레이 소스로 사용하고 있기 때문일 것입니다.C# 모뎀 및 AT 명령

현재 내 컴퓨터에서 전화를 걸고 내 컴퓨터에서 전화를받을 수 있습니다. 컴퓨터가 현재 영광스러운 전화의 역할을합니다. 두 명의 사용자가 서로를 앞뒤로 부를 수는 있지만 PC는 어색한 날짜에 제 3의 사람처럼 앉아있을 수 있습니다. 저는 컴퓨터가 발신자의 말을 듣는 데 더 적극적으로 참여하기를 원합니다.

관계없이 컴퓨터를 발신자 음성으로 듣게하는 코드를 망쳐 놓을 수는 없습니다. 나는 AT 명령에서 얼음을 깬다. 그래서 나에게 부드럽게 가라.

다음은 from1의 코드입니다. 어떤 도움이라도 좋을 것입니다. 고맙습니다!

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System; 
using System.Collections.Generic; 
    using System.Drawing; 
    using System.Windows.Forms; 
    using System.IO.Ports; 
    using System.Threading; 
    using System.IO; 

namespace VoiceModem 
{ 
    public partial class Form1 : Form 
    { 
     byte[] buffer; 
     public Form1() 
     { 

      InitializeComponent(); 
     } 
     SerialPort modemPort; 
     int bufferLoc; 
     string strBuf; 
     FileStream file; 
     StreamWriter logfile; 


     //note to self: the max port speed is listed at 115200 
     private void btnCALL_Click(object sender, System.EventArgs e) 
     { 
      string PHONENUMBER = "ATD=" + this.textBox1.Text + "\r"; 
      //File.Close("raw.txt", FileMode.Create); 
      //C:\Documents and Settings\Commander\Desktop 
      file = File.Open("raw.txt", FileMode.Create); 
      logfile = File.CreateText("log.txt"); 
      buffer = new byte[10 * 1024]; 
      modemPort = new SerialPort("COM4", 112500, Parity.None, 8, StopBits.One); 
      modemPort.ReadTimeout = SerialPort.InfiniteTimeout; 
      modemPort.DataReceived += new SerialDataReceivedEventHandler(modemPort_DataReceived); 
      modemPort.Open(); 
      modemPort.Write("AT\r"); //OK 
      modemPort.Write("ATA\r"); //ANSWERING IN VOICE MODE *** NO CARRIER 
      Thread.Sleep(500); 
      modemPort.Write("AT+FCLASS=8\r"); ///this should be voice here 
      Thread.Sleep(500); 
      modemPort.Write(PHONENUMBER); //DIAL number that D equals 
      // modemPort.Write("ATH\r"); //HANG UP IN VOICE MODE //ERROR 
      //modemPort.Write("AT+VSM=1\r"); 
     // modemPort.Write("AT+VTX\r"); //VOICE TRANSMIT MODE //ERROR 
     // modemPort.Write("AT+VLS=5\r"); 
      Thread.Sleep(500); 
      modemPort.Write("AT+VRX\r"); //VOICE RECEIVE MODE 
      Thread.Sleep(500); 
      modemPort.Write("AT+VLS=3+RX\r"); 
      //VLS 
      //0 - Telephone Line Select (Go on hook) 
      //2 - Speakers 
      //3 - Microphone 
      //4 - Telephone Line Select + Samples routed to/from Speakers/Mic in TX/RX modes 
      //6 - Speakerphone 
     } 

     private void button1_Click(object sender, System.EventArgs e) 
     { 
      //C:\Documents and Settings\Commander\Desktop 
      file = File.Open("raw.txt", FileMode.Create); 
       logfile = File.CreateText("log.txt"); 
      buffer = new byte[10*1024]; 
       modemPort = new SerialPort("COM4",112500, Parity.None, 8,StopBits.One); 
       modemPort.ReadTimeout = SerialPort.InfiniteTimeout; 
       modemPort.DataReceived+= new SerialDataReceivedEventHandler(modemPort_DataReceived); 
       modemPort.Open(); 
       modemPort.Write("AT\r"); //OK 
       //modemPort.Write("ATA\r"); //ANSWERING IN VOICE MODE *** NO CARRIER 
       modemPort.Write("AT+FCLASS=8\r"); 
      // "ATD=6022626151;\r" 


       //modemPort.Write(this.textBox1.Text); 


      //ATD4412345679; 
       //Dmn ATDmn will dial a phone number where m is the modifier: L, W, ,, ;, @, or S. 
      //It will dial the telephone number n. 

      // string str = "Hello " + userName + ". Today is " + date + "."; 
      string PHONENUMBER = "ATD=" + this.textBox1.Text + "\r"; 

       Thread.Sleep(500); 
       modemPort.Write(PHONENUMBER); //DIAL number that D equals 

       Thread.Sleep(500); 
       modemPort.Write("ATH\r"); //HANG UP IN VOICE MODE //ERROR 
       //modemPort.Write("AT+VSM=1\r"); 
       Thread.Sleep(500); 
       modemPort.Write("AT+VLS=?\r"); 
       Thread.Sleep(500); 
       modemPort.Write("AT+VTX\r"); //VOICE TRANSMIT MODE //ERROR 
       //modemPort.Write("AT+VLS=1\r"); 
       Thread.Sleep(500); 
       buffer = new byte[10*1024]; 
       modemPort.Write("AT+VRX\r"); //VOICE RECEIVE MODE 
       //modemPort.Write("AT+VRX\r"); 
     } 



     void modemPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs args) 
      { 
       int x = modemPort.BytesToRead; 
       modemPort.Read(buffer,0,x); 
       file.Write(buffer,0,x); 
       logfile.WriteLine(x.ToString()+args.EventType.ToString()); 
      } 


     private void button2_Click(object sender, System.EventArgs e) 
     { 


      modemPort.Close(); 
       file.Close(); 
       logfile.Close(); 

     } 

     private void button3_Click(object sender, System.EventArgs e) 
     { 
      Form2 form2 = new Form2(); 
      form2.Show(); 
      //Form2.show(); 
     } 

     private void button4_Click(object sender, System.EventArgs e) 
     { 
      this.richTextBox1.Text = System.IO.File.ReadAllText("raw.txt"); 
     } 

     private void button5_Click(object sender, System.EventArgs e) 
     { 
      this.richTextBox2.Text = System.IO.File.ReadAllText("log.txt"); 
     } 

     private void NUMBER1_Click(object sender, System.EventArgs e) 
     { 
      //tBox1.Text += "a"; 
      this.textBox1.Text += "1"; 
     } 

     private void NUMBER2_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "2"; 

     } 

     private void NUMBER3_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "3"; 

     } 

     private void NUMBER4_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "4"; 

     } 

     private void NUMBER5_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "5"; 

     } 

     private void NUMBER6_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "6"; 

     } 

     private void NUMBER7_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "7"; 

     } 

     private void NUMBER8_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "8"; 

     } 

     private void NUMBER9_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "9"; 

     } 

     private void NUMBER0_Click(object sender, System.EventArgs e) 
     { 
      this.textBox1.Text += "0"; 

     } 

     private void btnREDIAL_Click(object sender, System.EventArgs e) 
     { 
      buffer = new byte[10 * 1024]; 
      modemPort = new SerialPort("COM4", 112500, Parity.None, 8, StopBits.One); 
      modemPort.ReadTimeout = SerialPort.InfiniteTimeout; 
      modemPort.DataReceived += new SerialDataReceivedEventHandler(modemPort_DataReceived); 
      modemPort.Open(); 
      modemPort.Write("AT\r"); //OK 
      modemPort.Write("ATDL\r"); //OK 

     } 

     private void Form1_Load(object sender, System.EventArgs e) 
     { 
      this.textBox1.Focus(); 

     } 

     private void btnANSWER_Click(object sender, System.EventArgs e) 
     { 
      //C:\Documents and Settings\Commander\Desktop 
      file = File.Open("raw.txt", FileMode.Create); 
      logfile = File.CreateText("log.txt"); 
      buffer = new byte[10 * 1024]; 
      modemPort = new SerialPort("COM4", 112500, Parity.None, 8, StopBits.One); 
      modemPort.ReadTimeout = SerialPort.InfiniteTimeout; 
      modemPort.DataReceived += new SerialDataReceivedEventHandler(modemPort_DataReceived); 
      modemPort.Open(); 
      modemPort.Write("AT\r"); //OK 
      Thread.Sleep(500); 
      modemPort.Write("ATA\r"); //ANSWERING then gives beep-boops 
      Thread.Sleep(500); 
      //modemPort.Write("AT+VLS=1"); 
      //modemPort.Write("AT+FCLASS=8\r"); 
      // string str = "Hello " + userName + ". Today is " + date + "."; 
      // string PHONENUMBER = "ATD=" + this.textBox1.Text + "\r"; 
      // modemPort.Write(PHONENUMBER); //DIAL number that D equals 
      //modemPort.Write("ATH\r"); //HANG UP IN VOICE MODE //ERROR 
      //modemPort.Write("AT+VSM=1\r"); 
      //modemPort.Write("AT+++\r");// disconnects data mode to allow for voice mode 
      //voice mode is activated using ata 
      modemPort.Write("AT+VRX\r"); 
      //modemPort.Write("AT+VTX\r"); //VOICE TRANSMIT MODE //ERROR 
      //modemPort.Write("AT+VLS=1\r"); 
      // modemPort.Write("ATH\r"); //HANG UP IN VOICE MODE //ERROR 
      //modemPort.Write("AT+VRX\r"); 
      //modemPort.Write("ATA\r"); //answer the call 
     } 

     private void btnHANGUP_Click(object sender, System.EventArgs e) 
     { 
      modemPort.Close(); 
     } 

     private void textBox1_TextChanged(object sender, System.EventArgs e) 
     { 

      //int iPhone = 7065551212; 
      //string strPhone = string.Format("{0:(###) ###-####}", iPhone); 



      // this.textBox1.Mask = "(999) 000-0000"; 
     } 

     private void textBox1_Leave(object sender, System.EventArgs e) 
     { 
      // Reset the colors and selection of the TextBox after focus is lost. 
      string x = textBox1.Text; 
      double y = Double.Parse(x); 
      textBox1.Text = String.Format("{0:(###) ###-####}", y); 

      textBox1.ForeColor = Color.Black; 
      textBox1.BackColor = Color.White; 
      textBox1.Select(0, 0); 
     } 






     /* 
     * ACTIVE PROFILE: 
    E0 L1 M1 Q0 T V1 X4 &C1 &D2 &G0 &P0 
    S00:000 S01:000 S02:043 S03:013 S04:010 S05:008 S06:002 S07:060 S08:002 
    S10:014 S12:050 S29:070 

    STORED PROFILE 0: 
    E0 L1 M1 Q0 T V1 X4 &C1 &D2 &G0 &P0 
    S00:000 S02:043 S06:002 S07:050 S08:002 S10:014 S12:050 S29:070 
     * 
     * 
     * DIAG <2A4D3263 0=10> 

    DIAG <2A4D3263 1=0> 

    DIAG <2A4D3263 60=1> 
     * */ 





    } 



} 
+0

+1. 1996 년 이래로 'AT'명령을 보지 못했습니다. 아 .. 추억. 'zmodem'과'kermit' 프로토콜에 관한 글이 있는지 궁금합니다. – ja72

+0

나는 동의한다, 어셈블러 오래된 학교와 같지만 그것이 작동 할 때 정말로 예리하다! 내 VR (음성 인식) 프로그램이 당신의 세계를 뒤흔들 것입니다. 현재, 그것은 내 연구실의 거의 모든 측면을 제어합니다. –

답변

1

설명하는 것은 IVR 시스템입니다. 다음은 link to an article on why most modems will not work with IVR systems입니다. 모뎀을 작동 시키더라도 기본 IVR 시스템을 작동 시키려면 많은 개발 노력이 필요합니다. Voxeo는 free 2 port IVR system for developers called Prophecy입니다. 이 IVR 시스템은 VoiceXMLCCXML과 같은 개방형 W3C 표준을 사용하여 음성 응용 프로그램을 프로그래밍하고 적절한 음성 인식 및 TTS (텍스트 음성 변환)가 번들로 제공됩니다. C#을 사용하기 때문에 C# 및 ASP.NET MVC를 사용하여 Prophecy (또는 VoiceXML 호환 시스템)에서 실행되는 음성 응용 프로그램 개발을 크게 단순화하는 오픈 소스 프로젝트 VoiceModel을 살펴볼 것을 권합니다.

Prophecy의 전화 인터페이스는 SIP이므로 아날로그 전화선을 SIP로 변환하는 VoIP 게이트웨이를 사용하게됩니다. 다른 대답에 언급 된 FXO 게이트웨이가 SIP를 지원하면 작동 할 수도 있습니다. Voxeo는 약 395 달러에 소매가 인 AudioCodes MP-114 which is a 4 port analog system을 지원합니다. 당신은 더 적은을 위해 eBay에 사용한 것을 찾을 수있을 것입니다. 그들은 소프트웨어 VoIP 게이트웨이로 Dialogic 카드를 지원하기 위해 사용하지만, 지원 악몽으로 밝혀졌고 음성 인식에 많은 문제를 야기 시켰습니다. 모뎀을 사용하지 않는 다른 이유 중 하나 인 음성 인식이 제대로 작동하려면 꽤 괜찮은 음질이 필요합니다. 아날로그 입력이있는 VoIP 게이트웨이를 올바르게 작동시키는 것은 어려울 수 있지만 AudioCodes 제품을 사용하여 성공했습니다. AudioCodes의 또 다른 이점은 Voxeo가 지원하며 무료이며 우수한 지원입니다.

+0

답변을 주신 모든 분들께 감사드립니다. 내 연구를 계속하고 Zoomtel에서 담당자에게 연락하고 AT 명령을 단순히 모뎀을 열거 나 설정하는 데 사용한다는 것을 알게되었습니다. 들어오는 음성이 다른 일을하기 위해 필요하다면 나는 그것을 달성하기 위해 다른 소프트웨어 제품을 활용할 필요가있다. 즉, 간단히 말해서, 내 코드에 대해 잘못된 점은 없지만 AT 명령을 단독으로 사용하여 컴퓨터를 청취 할 수는 없습니다. –

2

전화에 응답하는 것은 모뎀입니다. 다른 모뎀과 만 통신합니다. 전화 응답 및 프로그램에 오디오 전달을 지원하지 않습니다.

+0

여기를 확인하십시오 : http://www.zoomtel.com/products/dial_up_internal.html#internal_3030 음성 메일이 가능하며 이는 PCI 카드입니다. 음성을 녹음하고 녹음하고 재생할 수 있습니다. AT 명령을 사용하여 녹음 할 수있는 방식으로 오디오를 라우팅하려고합니다. 빨리 녹음하고 재생할 수 있다고해도 오디오는 읽기 쉽습니다. 어떻게 생각해? –

+0

연결 한 모뎀이 사운드를 처리하지 못하면 통과 장치로 작동하고 오디오를 사운드 카드로 전달합니다. –

+0

음성/오디오를 독립적으로 처리하는 외부 장치 (즉, 처리를 위해 컴퓨터에 오디오가 제공되지 않음)가 원하는 작업을 수행하는 것으로 설명됩니다. 이는 게시글에서 설명한 내용과 크게 다릅니다. –

4

모뎀 (MOdulator/DEModulator)을 사용하여 수행 할 수 없습니다. 이것들은 디지털 통신을 전송 라인 다운 전송을 위해 아날로그로 전환 한 다음 아날로그 신호를 다시 디지털로 변경하도록 설계되었습니다. 당신이 원하는 것은 음성 처리 카드입니다.

내가 가장 잘 알고있는 것은 Dialogic이지만 약 10 년 전이었습니다. 나는 빠른 검색을했고 Dialogic Diva 2 Port 아날로그 카드는 당신이 원하는 것입니다. 텔레포니 보드 또는 카드를 검색 할 수도 있습니다. Digium이라는 회사의 다른 카드를 보았습니다.

음성 처리 카드는 PC 마더 보드의 PCI 슬롯에 맞습니다. 아날로그 전화선을 카드에 꽂습니다. 보드의 API를 통해 마치 컴퓨터가 전화 인 것처럼 전화선과 상호 작용할 수 있습니다. 10 년 전에는 사람의 음성 주파수를 감지 할 수 있었지만 음성 인식은 초기 단계였습니다. 전화선을 통해 사운드 파일을 재생하고 ("고객 서비스로 1 번을 누르십시오") 프로그램 제어를 위해 터치 톤 (일명 DTMF)에 응답 할 수 있습니다.

간단한 음성 메일에서 PC의 예쁜 멀티 라인 전화 시스템까지 모든 것을 쓸 수 있습니다. Dialogic 카드의 API가 엄청나게 증가했다고 확신합니다. 그것이 내가 다음에 보게 될 곳입니다. 모뎀은 단순히 원하는 것을 수행하지 않습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 당신이 제안한 피드백 중 일부를 들여다 볼 것입니다. 그러나 제가 그 돈을 뭔가에 떨어 뜨릴 필요가 있는지 궁금합니다. 내 지갑이 폭발하지 않았 음을보고 비교적 저렴한 부품으로 건물을 짓고 있습니다. 흥미롭게도 컴퓨터의 기본값은 모뎀을 팩스/데이터 모뎀으로 자동 인식합니다. 그래서 나는 그것을 약간 해킹해야했고 이제는 PC도 음성을 인식합니다. 그게 내가 "음성"모드를 받아 들일 수 있었던 유일한 방법은 dll과 드라이버의 일부를 다시 작성하는 것이 었습니다. 나는 더 많이 중계하기를 원하지만, 나는 차라리 빠져있다. –

+0

네, 전화 카드가 필요합니다. 이것이 하나의 접근법입니다. 다른 접근법은 VOIP 전화 서비스를받는 것입니다. 그러면 컴퓨터가 데이터 네트워크를 통해 IP 트래픽으로 들어오는 전화 통화에 응답 할 수 있습니다. 몇 가지 아이디어를 얻으려면 Asterisk (http://www.asterisk.org/)를 확인하십시오. –

+0

http://www.asterisk.org/hardware에서 전화 통신 인터페이스 카드 참조 –

0

FXO gateway은 컴퓨터에서 사용할 수있는 신호로 POTS 신호를 보낼 수있게 해줍니다. 저가형 가전 기기는 $50-70 range에서 구입할 수 있습니다.