それがすべて始まった方法
友人からロシア語から英語の基本文を翻訳するようにというメッセージを受け取った後、友人がGoogleに送られました。 GoogleからSkype経由で送信します。 しかし、それはあまりにも退屈であり、ボットは目的の言語で目的の文を呼び出して話すことも決定しました。
少し検索してみたところ、Skypeとやり取りできるSkype4COMライブラリが見つかりました。
また、サウンドを処理するために、 NAudioを使用し、Google- xNetからデータを収集します。
コーディングを開始
まず、システムにSkype4COMを登録する必要があります。これを実行するには、
regsvr32 "__dll"
その後、プロジェクト内のすべてのdllにリンクを追加できます。
次に、Skypeに参加する必要があります。
//, Skype if (!Skype.Client.IsRunning) { Skype.Client.Start(true, true); } // Skype ((_ISkypeEvents_Event)Skype).AttachmentStatus += OurAttachmentStatus; // Skype.CallStatus += CallStatusChanged; Skype.MessageStatus += ReceiveMessage; // Skype Skype.Attach(8);
Skypeへの参加には比較的長い時間がかかるため、いつ参加したかを知る必要があります。
private void OurAttachmentStatus(TAttachmentStatus status) { if (status == TAttachmentStatus.apiAttachSuccess) textBox1.Text += " "; }
Skypeに参加したので、メッセージの受信を開始できます。
private void ReceiveMessage(ChatMessage pmessage, TChatMessageStatus status) { // if (status == TChatMessageStatus.cmsReceived) { // : string[] message = pmessage.Body.Split(':'); if (message.Length != 2) return; string mess = message[1]; string toLang = message[0]; // string translate = GetTranslate(mess, toLang); // byte[] bytes = GetFile(translate, toLang); Stream stream = new MemoryStream(bytes); // Skype4COM wav , mp3 wav. TimeSpan time = Mp3ToWav(stream, @"d:\test.wav"); // Skype.PlaceCall(pmessage.FromHandle); // pmessage.Chat.SendMessage(translate); //, timer = new Timer(time.TotalMilliseconds); timer.Elapsed += FinishCall; timer.AutoReset = false; } }
ネットワークを操作するために、xNetライブラリを使用することにしました。これにより、Webサイトでのアクションを簡単に自動化できます。
開始するには、オファーの翻訳を取得する必要があります。
private string GetTranslate(string message, string toLang) { // - using (HttpRequest request = new HttpRequest()) { StringDictionary reqParams = new StringDictionary(); // , , // , string myLang; if (toLang == "en") { myLang = "ru"; } else { myLang = "en"; } // - request.UserAgent = HttpHelper.RandomChromeUserAgent(); reqParams["text"] = message; reqParams["tl"] = toLang; reqParams["sl"] = myLang; reqParams["client"] = "x"; // string s = request.Get( "http://translate.google.ru/translate_a/t", reqParams).ToText(); // string translate = s.Substring(":\"", "\""); return translate; } }
これで、彼の声を演じることができます。
private byte[] GetFile(string translate, string toLang) { using (HttpRequest request = new HttpRequest()) { StringDictionary reqParams = new StringDictionary(); // - reqParams["ie"] = "UTF-8"; reqParams["q"] = translate; reqParams["tl"] = toLang; reqParams["prev"] = "input"; // byte[] bytes = request.Get( "http://translate.google.ru/translate_tts", reqParams).ToBytes(); return bytes; } }
次に、ファイルをWavにトランスコードし、ディスクに保存する必要があります。
public static TimeSpan Mp3ToWav(Stream mp3File, string outputFile) { // mp3 using (Mp3FileReader reader = new Mp3FileReader(mp3File)) { // var newFormat = new WaveFormat(16000, 16, 1); using (WaveStream pcmStream = new WaveFormatConversionStream(newFormat, reader)) { // WaveFileWriter.CreateWaveFile(outputFile, pcmStream); // return reader.TotalTime; } } }
これで、ファイル再生コードを記述できます。
private void CallStatusChanged(Call pcall, TCallStatus status) { // , call = pcall; // if (status == TCallStatus.clsInProgress) { // pcall.set_InputDevice(TCallIoDeviceType.callIoDeviceTypeFile, @"d:\test.wav"); // timer.Start(); } }
さて、呼び出し完了コード:
private void FinishCall(object sender, ElapsedEventArgs e) { call.Finish(); }
プロジェクトファイル
結論として
私は、コードに多くの間違いを犯したに違いないことを知っています。プログラミングの達人が、私が間違っていることを教えてくれることを願っています。
PS良い方法では、Skype.CallInputStatusChangedイベントで通話を終了する必要がありますが、私がどれほど悩んでも、それは私には思いつきませんでした。