2017-01-13 15 views
0

Skypeで音声添付ファイルをnode.js chatbotに送信する際にBing Speech Recognition APIを使用して音声をテキストに変換したいと考えています。私はBotBuilder-Samples intelligence-SpeechToTextのコードを使用しようとしましたが、音声認識はエミュレータでのみ機能します。 Skypeでオーディオ/ウェーブファイルを送信するとき、ボットは「あなたは言った:天気はどうですか?」の代わりに全く反応しません。node.jsでBing音声認識APIを使用するSkypeでボットフレームワーク

この問題は、Skypeの添付ファイルにアクセスするためにJWTトークンが必要であることが原因と考えられます。したがって、私はBotBuilder-Samples core-ReceiveAttachmentのコードを使用してSkypeのオーディオ添付ファイルにアクセスしようとしましたが、これは針の代わりにrequest-promiseを使用してHTTP要求を行います。ただし、request-promiseの結果はストリームではなく、getTextFromAudioStream()関数で処理することはできません。

私はSkypeの音声添付ファイルで音声認識を動作させる方法を尋ねたいと思います。

ありがとうございます。

// Add your requirements 
 
var restify = require("restify"); 
 
var builder = require("botbuilder"); 
 
var fs = require("fs"); 
 
var needle = require("needle"); 
 
var request = require("request"); 
 
var speechService = require("./speech-service.js"); 
 
var Promise = require('bluebird'); 
 
var request = require('request-promise').defaults({ encoding: null }); 
 

 
//========================================================= 
 
// Bot Setup 
 
//========================================================= 
 

 
// Setup Restify Server 
 
var server = restify.createServer(); 
 
server.listen(process.env.PORT || 3000, function() { 
 
    console.log("%s listening to %s", server.name, server.url); 
 
}); 
 

 
// Create chat bot 
 
var connector = new builder.ChatConnector ({ 
 
    appId: process.env.MICROSOFT_APP_ID, 
 
    appPassword: process.env.MICROSOFT_APP_PASSWORD 
 
}); 
 

 
server.post("/api/messages", connector.listen()); 
 

 
var bot = new builder.UniversalBot(connector); 
 

 
//========================================================= 
 
// Bots Middleware 
 
//========================================================= 
 

 
// Anytime the major version is incremented any existing conversations will be restarted. 
 
bot.use(builder.Middleware.dialogVersion({ version: 1.0, resetCommand: /^reset/i })); 
 

 
//========================================================= 
 
// Bots Dialogs 
 
//========================================================= 
 

 
bot.dialog("/", [ 
 
    function (session, results, next) { 
 
     var msg = session.message; 
 

 
     if (hasAudioAttachment(msg)) { 
 
      // Message with attachment, proceed to download it. 
 
      // Skype attachment URLs are secured by a JwtToken, so we need to pass the token from our bot. 
 
      var attachment = msg.attachments[0]; 
 
      var fileDownload = isSkypeMessage(msg) 
 
       ? requestWithToken(attachment.contentUrl) 
 
       : request(attachment.contentUrl); 
 

 
      fileDownload.then(
 
       function (response) { 
 
        // Send reply with attachment type & size 
 
        var reply = new builder.Message(session) 
 
         .text('Attachment from %s of %s type and size of %s bytes received.', msg.source, attachment.contentType, response.length); 
 
        session.send(reply); 
 
       }).catch(function (err) { 
 
        console.log('Error downloading attachment:', { statusCode: err.statusCode, message: err.response.statusMessage }); 
 
      }); 
 

 
      var stream = isSkypeMessage(msg) 
 
       ? getAudioStreamWithToken(attachment) 
 
       : getAudioStream(attachment); 
 

 
      speechService.getTextFromAudioStream(stream) 
 
       .then(text => { 
 
        session.send("You said: " + text); 
 
       }) 
 
       .catch(error => { 
 
        session.send("Oops! Something went wrong. Try again later."); 
 
        console.error(error); 
 
       }); 
 
     } 
 
     else { 
 
      session.send("Did you upload an audio file? I'm more of an audible person. Try sending me a wav file"); 
 
     } 
 
    } 
 
]); 
 

 
function getAudioStream(attachment) { 
 
    return needle.get(attachment.contentUrl, { headers: {'Content-Type': "audio/wav"} }); 
 
} 
 

 
function getAudioStreamWithToken(attachment) { 
 
    var headers = {}; 
 

 
    connector.getAccessToken((error, token) => { 
 
     headers['Authorization'] = 'Bearer ' + token; 
 
    }); 
 

 
    headers['Content-Type'] = attachment.contentType; 
 

 
    return needle.get(attachment.contentUrl, { headers: headers }); 
 
} 
 

 
// Request file with Authentication Header 
 
function requestWithToken(url) { 
 
    return obtainToken().then(function (token) { 
 
     return request({ 
 
      url: url, 
 
      headers: { 
 
       'Authorization': 'Bearer ' + token, 
 
       'Content-Type': 'application/octet-stream' 
 
      } 
 
     }); 
 
    }); 
 
}; 
 

 
// Promise for obtaining JWT Token (requested once) 
 
var obtainToken = Promise.promisify(connector.getAccessToken.bind(connector)); 
 

 
function isSkypeMessage(message) { 
 
    return message.source === "skype"; 
 
};

答えて

0

添付ファイルにアクセスする際のサンプルのコードは、すでに(hereを参照)スカイプを検討しています。あなたが当てていた問題は、サンプルのキーがクォータを超えたためです。昨日、新しいBing Speech Keyがサンプルに追加されたので、もう一度試してみることをお勧めします。

また、サンプルの更新版もすぐに追加される予定です。コードは現在code reviewです。

+0

こんにちはエズキエル、あなたはBing Speech APIキーを参照していますか?私がAzureから入手した鍵を使用しているので、割り当てが問題を引き起こしてはいけません。また、エミュレータで添付ファイルを送信すると、音声認識が機能しています。 – DevastatingCritical

+0

私は、Skypeのリポジトリからnode.jsサンプルを試してみましたが、正常に動作しています。今後のバージョンで試してみましょう。あなたが貼り付けたコードはあなたのコードであり、サンプルのものではないようです。 –

+0

こんにちはエゼキエル...ありがとうございました!!! AzureでボットのWebアプリケーションに入力したSpeech APIキーを再確認しました...間違ったキーを誤って使用しました。私がローカルに保管したキーは正しいので、Skypeではなくエミュレータで作業していたのです。 – DevastatingCritical