2012-05-15 82 views
2

好吧,我的大腦已經對我產生了短暫的影響。我想要做的是編寫一個程序,讓我在電腦響了很多響之後打電話給我的電腦。在這一點上,我可以對我的電腦說話,並利用電腦的語音識別功能。但是,我的電腦沒有通過電話接收我的聲音,作爲「麥克風輸入」音頻源。這很可能是因爲COM4端口是調制解調器用作其中繼源的東西。C#調制解調器和AT命令

目前,我可以從我的電腦撥打電話,並從我的電腦接到電話。電腦目前是一個榮耀的電話。兩個用戶可以來回互相呼叫,但電腦就像第三個人一樣坐在那裏尷尬的日子。我希望計算機在收聽主叫方時發揮更積極的作用。

無論如何,我似乎無法確定讓我能讓電腦聽取來電者聲音的代碼。我只是在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系統使用開放的W3C標準(如VoiceXMLCCXML)來編程您的語音應用程序,並且具有體面的語音識別和文本轉語音(TTS)。由於您使用的是C#,我建議您查看開源項目VoiceModel,它極大地簡化了使用C#和ASP.NET MVC開發將在Prophecy(或任何VoiceXML兼容系統)上運行的語音應用程序。

Prophecy的電話接口是SIP,因此成本將會得到一個VoIP網關,將您的模擬電話線路轉換爲SIP。如果支持SIP,另一個答案中提到的F​​XO網關可能會工作。 Voxeo支持AudioCodes MP-114 which is a 4 port analog system,零售價約爲395美元。您可能能夠在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端口模擬卡是你想要的東西。您還可以搜索電話板或卡。我看到一家名爲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中獲得低端消費設備。

相關問題