Я хотел бы использовать API распознавания речи Bing для преобразования речи в текст при отправке аудио вложений в Skype на мой node.js chatbot. Я пробовал использовать код от BotBuilder-Samples intelligence-SpeechToText, однако распознавание речи работает только в эмуляторе. При отправке аудио/волнового файла в Skype бот не отвечает вообще, а не «Ты сказал: какая погода похожа?».Использование Bing Speech Recognition API с node.js Bot Framework по Skype
Я подозревал, что проблема может быть связана с тем, что для доступа к приложениям в Skype требуется токен JWT. Следовательно, я попытался получить доступ к аудиозаписям в Skype, используя код от BotBuilder-Samples core-ReceiveAttachment, который использует запрос-обещание вместо иглы для запроса HTTP. Однако результат запроса-обещания не является потоком и не может быть обработан функцией 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";
};
Привет, Ezequiel, вы имеете в виду ключ API Bing Speech? Потому что я использую свой ключ, который я получил от Azure, поэтому квота не должна была вызвать проблему. Кроме того, распознавание речи работает, когда я отправляю вложение в эмулятор. – DevastatingCritical
Я просто попробовал образец node.js из репозитория в Skype, и он работает нормально. Попробуйте с будущей версией и посмотрите, работает ли она. Код, который вы вставляли, кажется, является вашим кодом, а не тем, который находится в образце –
Привет, Ezequiel ... большое спасибо! Я только что проверил ключ API речи, я вошел в веб-приложение бота в Azure ... Я случайно использовал неправильный ключ. Ключ, который я сохранил локально, является правильным, поэтому он работал в эмуляторе, а не в Skype. – DevastatingCritical