2

さて、私の脳は私にショートしました。私がやろうとしているのは、コンピューターが何度も鳴った後、コンピューターに電話をかけることができるプログラムを書くことです。この時点で、私は自分のコンピューターと話し、コンピューターの音声認識機能を利用できるようになります。しかし、私のコンピュータは「マイク入力」オーディオソースとして電話を介して私の声を受信して​​いません。おそらくそれは、COM4ポートがモデムがリレーソースとして使用しているものであるためです。

現在、自分のコンピューターから電話をかけたり、自分のコンピューターから電話を受けたりすることができます。コンピュータは現在、栄光の電話として機能しています。2人のユーザーはお互いに電話をかけ合うことができますが、PCは厄介な日に第三者のようにそこに座っています。発信者の話を聞く際に、コンピューターがもっと積極的な役割を果たすことを望んでいます。

とにかく、コンピューターに発信者の声を聞かせるためのコードを打ち出すことはできないようです。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>
         * */





    } 



}
4

4 に答える 4

4

モデム(MOdulator / DEModulatorの略)ではできません。これらは、デジタル通信をアナログに変換して電話回線を送信し、アナログ信号をデジタルに戻すように設計されています。欲しいのは音声処理カードです。

私が最もよく知っているのはDialogicですが、それは約10年前のことです。簡単に検索しましたが、DialogicDiva2ポートアナログカードはあなたが望むようなものです。テレフォニーボードやカードを検索することもできます。Digiumという会社の別のカードを見ました。

音声処理カードは、PCマザーボードのPCIスロットに収まります。アナログ電話回線をカードに接続します。ボードのAPIを介して、コンピュータが電話であるかのように電話回線を操作できます。10年前は人間の音声周波数を検出できましたが、音声認識はまだ始まったばかりでした。電話回線を介してサウンドファイルを再生し(「カスタマーサービスの場合は1を押す」)、タッチトーン(別名DTMF)に応答してプログラムを制御できます。

単純な音声メールから非常にすっきりとした複数回線の電話システムまで、すべてPC上で何でも書くことができます。DialogicカードのAPIは、パワーが劇的に向上したと確信しています。それが私が次に見るところです。モデムは単にあなたがしたいことをしません。

于 2012-05-15T03:39:04.590 に答える
2

電話に答えるのはモデムです。他のモデムとのみ通信します。電話に応答したり、音声をプログラムに渡したりすることはサポートされていません。

于 2012-05-15T03:13:58.287 に答える
1

あなたが説明しているのはIVRシステムです。これは、ほとんどのモデムがIVRシステムで動作しない理由に関する記事へのリンクです。モデムを機能させたとしても、基本的なIVRシステムを機能させるために多くの開発努力が必要です。Voxeoには、Prophecyと呼ばれる開発者向けの無料の2ポートIVRシステムがあります。このIVRシステムは、VoiceXMLCCXMLなどのオープンなW3C標準を使用して音声アプリケーションをプログラムし、適切な音声認識とテキスト読み上げ(TTS)がバンドルされています。C#を使用しているので、C#とASP.NET MVCを使用してProphecy(またはVoiceXML互換システム)で実行される音声アプリケーションの開発を大幅に簡素化する オープンソースプロジェクトVoiceModelを確認することをお勧めします。

ProphecyのテレフォニーインターフェイスはSIPであるため、アナログ電話回線をSIPに変換するVoIPゲートウェイを取得するためのコストが発生します。別の回答で言及されているFXOゲートウェイは、SIPをサポートしている場合に機能する可能性があります。Voxeoは、4ポートアナログシステムであるAudioCodesMP-114をサポートしています。小売価格は約395ドルです。あなたはより安くeBayで中古のものを見つけることができるかもしれません。彼らはソフトウェアVoIPゲートウェイでDialogicカードをサポートするために使用しますが、それはサポートの悪夢であることが判明し、音声認識で多くの問題を引き起こしたため、彼らはそれを落としました。音声認識を正しく機能させるには、かなり適切な音声品質が必要です。これは、モデムを使用しないもう1つの理由です。アナログ入力を備えたVoIPゲートウェイを正しく機能させるのは難しい場合がありますが、AudioCodes製品を使用して成功しました。AudioCodesのもう1つの利点は、Voxeoによってサポートされており、サポートが無料で優れていることです。

于 2012-05-15T13:29:09.877 に答える
0

必要なのはFXOゲートウェイです。これにより、POTS信号をコンピューターで使用できるものに変換できます。あなたは50ドルから70ドルの範囲でローエンドの消費者向けデバイスを手に入れることができます。

于 2012-05-15T04:08:15.170 に答える