Статьи

IBM Watson QA + распознавание речи + синтез речи = разговор с вашим компьютером

Еще в ноябре  я опубликовал здесь в своем блоге демонстрационное приложение,  демонстрирующее  службу IBM Watson QA Service  для когнитивных / естественных языковых вычислений, подключенную к  API веб-речи  в Google Chrome, для реального разговорного взаимодействия с веб-приложением. Это хорошая демонстрация, но она всегда сводила меня с ума, что она работала только в Chrome. В прошлом месяце команда IBM Watson выпустила  5 новых услуги , и думает , что …  распознавание речи  и  синтез речи  включены!

Эти две службы позволяют вам быстро добавлять функции преобразования текста в речь или преобразования речи в текст в любое приложение. Есть ли лучший способ показать их, чем обновить мое существующее приложение, чтобы использовать новые речевые сервисы?

Итак, вот оно:  watsonhealthqa.mybluemix.net !

Благодаря использованию сервисов Watson он теперь может работать в любом браузере, который поддерживает getUserMedia (для распознавания речи) и HTML5 <Audio> (для воспроизведения речи).

(Полный исходный код доступен в нижней части этого поста)

Вы можете посмотреть видео об этом в действии ниже:

Если ваш браузер не поддерживает API getUserMedia или HTML5 <Audio>, ваш пробег может отличаться. Вы можете проверить, где эти функции поддерживаются с помощью этих ссылок:  <Audio> getUserMedia

Предупреждение: это предназначается для браузеров настольных компьютеров — HTML5 Audio — беспорядок на мобильных устройствах из-за ограниченной поддержки кодеков и незрелых API.

Так как же все это работает?

Как и  служба QA ,  в IBM Bluemix теперь доступны  новые  службы Text To Speech  и  Speech To Text , так что вы можете создать новое приложение, использующее любую из этих служб, или добавить их в любое существующее приложение.

Я просто добавил службы «Текст в речь» и «Речь в текст» в свое существующее приложение Healthcare QA, которое работает в Bluemix:

bluemix-панель

IBM Bluemix Dashboard

Эти сервисы доступны через REST API. Добавив их в свое приложение, вы можете легко использовать их в любом приложении.

Я обновил код из моего  предыдущего примера  двумя способами: 1) использовать  оболочку Watson Node.js,  которая значительно упрощает взаимодействие с Watson, и 2) воспользоваться преимуществами этих новых сервисов.

Watson Node.js Wrapper

Используя  Watson Node.js Wrapper , вы можете легко создавать экземпляры сервисов Watson в одной строке кода. Например:

var watson = require('watson-developer-cloud');
var question_and_answer_healthcare = watson.question_and_answer(QA_CREDENTIALS);
var speechToText = watson.speech_to_text(STT_CREDENTIALS);

Учетные данные поступают из конфигурации вашей среды, затем вы просто создаете экземпляры тех служб, которые хотите использовать.

QA Сервис

Код для использования сервиса теперь намного проще, чем в предыдущей версии. Когда мы хотим отправить вопрос в службу Qatson Watson, теперь вы можете просто вызвать метод ask в экземпляре службы QA.

Ниже приведен мой серверный код из app.js, который принимает отправку POST из браузера, делегирует вопрос Уотсону, принимает результат и отображает HTML с использованием   шаблона Jade . См.  Руководство по началу работы для службы контроля качества Watson,  чтобы узнать больше об оболочках для Node или Java.

// Handle the form POST containing the question
app.post('/ask', function(req, res){
 
    // delegate to Watson
    question_and_answer_healthcare.ask({ text: req.body.questionText}, function (err, response) {
        if (err)
            console.log('error:', err);
        else {
          var response = extend({ 'answers': response[0] },req.body);
 
          // render the template to HTML and send it to the browser
          return res.render('response', response);
        }
    });
});

Сравните это с  предыдущей версией , и вы быстро увидите, что это намного проще.

Синтез речи

На данный момент у нас уже есть функциональный сервис, который может принимать текст на естественном языке, отправлять его в Watson и возвращать результат поиска в виде текста. Следующим логическим шагом для меня было добавление синтеза речи с помощью Watson  Text To Speech Service  (TTS). Опять же,  сервисы Watson Node Wrapper и Rats от  Watson делают эту задачу очень простой. На стороне клиента вам просто нужно установить src экземпляра <audio> в URL для службы TTS:


1
<
audio
controls
=
""
autoplay
=
""
src
=
"/synthesize?text=The text that should generate the audio goes here"
></
audio
>

На сервере вам просто нужно синтезировать аудио из данных в строке запроса URL. Вот пример того, как вызвать службу text to voice непосредственно из  примера приложения Watson TTS :

var textToSpeech = new watson.text_to_speech(credentials);
 
// handle get requests
app.get('/synthesize', function(req, res) {
 
  // make the request to Watson to synthesize the audio file from the query text
  var transcript = textToSpeech.synthesize(req.query);
 
  // set content-disposition header if downloading the
  // file instead of playing directly in the browser
  transcript.on('response', function(response) {
    console.log(response.headers);
    if (req.query.download) {
      response.headers['content-disposition'] = 'attachment; filename=transcript.ogg';
    }
  });
 
  // pipe results back to the browser as they come in from Watson
  transcript.pipe(res);
});

Служба Watson TTS поддерживает   форматы файлов .ogg  и  .wav . Я немного изменил этот пример, чтобы он возвращал файлы .ogg для Chrome и Firefox и файлы .wav для других браузеров. На стороне клиента они воспроизводятся с использованием тега HTML5  <audio>  . Вы можете увидеть мои модификации в  репозитории git .

Распознавание речи

Теперь, когда мы можем обрабатывать естественный язык и генерировать речь, последняя часть решения заключается в распознавании устного ввода и его преобразовании в текст. Служба Watson  Speech To Text  (STT) обрабатывает это для нас. Как и служба TTS, служба Speech To Text также имеет  пример приложения с  исходным кодом,  который поможет вам начать работу.

Этот сервис использует  API браузера  getUserMedia (потоковая передача) с  socket.io  на узле для потоковой передачи данных обратно на сервер с минимальной задержкой. Самое приятное, что вам не нужно ничего настраивать самостоятельно. Просто используйте код из  примера приложения . Примечание: API getUserMedia не везде поддерживается , поэтому имейте  в виду .

На стороне клиента вам просто нужно создать экземпляр класса SpeechRecognizer в JavaScript и обработать результат:

var recognizer = new SpeechRecognizer({
  ws: '',
  model: 'WatsonModel'
});
 
recognizer.onresult = function(data) {
 
    //get the transcript from the service result data
    var result = data.results[data.results.length-1];
    var transcript = result.alternatives[0].transcript;
 
    // do something with the transcript
    search( transcript, result.final );
}

На сервере вам нужно создать экземпляр службы Watson Speech To Text и настроить обработчики для пост-запроса на получение аудиопотока.

// create an instance of the speech to text service
var speechToText = watson.speech_to_text(STT_CREDENTIALS);
 
// Handle audio stream processing for speech recognition
app.post('/', function(req, res) {
    var audio;
 
    if(req.body.url && req.body.url.indexOf('audio/') === 0) {
        // sample audio stream
        audio = fs.createReadStream(__dirname + '/../public/' + req.body.url);
    } else {
        // malformed url
        return res.status(500).json({ error: 'Malformed URL' });
    }
 
    // use Watson to generate a text transcript from the audio stream
    speechToText.recognize({audio: audio, content_type: 'audio/l16; rate=44100'}, function(err, transcript) {
        if (err)
            return res.status(500).json({ error: err });
        else
            return res.json(transcript);
    });
});

Исходный код

Вы можете взаимодействовать с действующим экземпляром этого приложения по адресу  watsonhealthqa.mybluemix.net , а полный код на стороне клиента и сервера доступен по адресу  github.com/triceam/IBMWatson-QA-Speech .

Просто  настройте приложение Bluemix , клонируйте пример кода, запустите установку NPM и разверните приложение в Bluemix с помощью  CLI Cloud Foundry .

Полезные ссылки