Я хотел бы знать, есть ли хороший API для «распознавания голоса» и «преобразования текста в речь» в C ++. Я прошел фестиваль, который вы даже не можете сказать, говорит ли компьютер, потому что это так реально и Voce также.
к несчастью Festival
кажется, не поддерживает распознавание голоса (я имею в виду «Voice to Text») и voce
построен на Java, и это беспорядок в C ++ из-за JNI.
API должен поддерживать как «Текст в голос», так и «Голос в текст», и у него должен быть хороший набор примеров, по крайней мере, за пределами сайта владельца. Идеально, если у него есть возможность идентифицировать набор заданных голосов, но это необязательно, так что не беспокойтесь.
Что я собираюсь сделать с API, так это когда набор голосовых команд повернет устройство робота влево, вправо и т. Д. А также, скажи мне «Доброе утро», «Спокойной ночи» и т. Д. Эти слова будут закодировано в программе.
Пожалуйста, помогите мне найти хороший C ++ голосовой API для этой цели. Если у вас есть доступ к учебнику / учебному пособию по установке, пожалуйста, будьте любезны поделиться им со мной.
если вы разрабатываете на Windows, вы можете использовать MS Speech API которые позволяют выполнять распознавание голоса (ASR) и преобразование текста в речь (TTS).
Вы можете найти несколько примеров на эта страница и очень простой пример распознавания голоса в эта почта.
Я обнаружил, что если я делаю аудиозапись (я использовал qtmultimedia для этого) должен быть flac
Узнайте больше здесь
Затем я могу загрузить в Google, а затем отправить мне обратно JSON
Затем я написал несколько c ++ / qt для этого, чтобы превратить в плагин qml
Вот этот (альфа) код. Обратите внимание, что вы должны заменить
< ВАШ ФЛАК FILE.flac>
с вашим настоящим файлом flac.
speechrecognition.cpp
#include <QNetworkReply>
#include <QNetworkRequest>
#include <QSslSocket>
#include <QUrl>
#include <QJsonDocument>
#include <QJsonArray>
#include <QJsonObject>
#include "speechrecognition.h"#include <QFile>
#include <QDebug>
const char* SpeechRecognition::kContentType = "audio/x-flac; rate=8000";
const char* SpeechRecognition::kUrl = "http://www.google.com/speech-api/v1/recognize?xjerr=1&client=directions&lang=en";
SpeechRecognition::SpeechRecognition(QObject* parent)
: QObject(parent)
{
network_ = new QNetworkAccessManager(this);
connect(network_, SIGNAL(finished(QNetworkReply*)),
this, SLOT(replyFinished(QNetworkReply*)));
}
void SpeechRecognition::start(){
const QUrl url(kUrl);
QNetworkRequest req(url);
req.setHeader(QNetworkRequest::ContentTypeHeader, kContentType);
req.setAttribute(QNetworkRequest::DoNotBufferUploadDataAttribute, false);
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
QFile *compressedFile = new QFile("<YOUR FLAC FILE.flac>");
compressedFile->open(QIODevice::ReadOnly);
reply_ = network_->post(req, compressedFile);
}
void SpeechRecognition::replyFinished(QNetworkReply* reply) {
Result result = Result_ErrorNetwork;
Hypotheses hypotheses;
if (reply->error() != QNetworkReply::NoError) {
qDebug() << "ERROR \n" << reply->errorString();
} else {
qDebug() << "Running ParserResponse for \n" << reply << result;
ParseResponse(reply, &result, &hypotheses);
}
emit Finished(result, hypotheses);
reply_->deleteLater();
reply_ = NULL;
}
void SpeechRecognition::ParseResponse(QIODevice* reply, Result* result,
Hypotheses* hypotheses)
{
QString getReplay ;
getReplay = reply->readAll();
qDebug() << "The Replay " << getReplay;
QJsonDocument jsonDoc = QJsonDocument::fromJson(getReplay.toUtf8());
QVariantMap data = jsonDoc.toVariant().toMap();
const int status = data.value("status", Result_ErrorNetwork).toInt();
*result = static_cast<Result>(status);
if (status != Result_Success)
return;
QVariantList list = data.value("hypotheses", QVariantList()).toList();
foreach (const QVariant& variant, list) {
QVariantMap map = variant.toMap();
if (!map.contains("utterance") || !map.contains("confidence"))
continue;
Hypothesis hypothesis;
hypothesis.utterance = map.value("utterance", QString()).toString();
hypothesis.confidence = map.value("confidence", 0.0).toReal();
*hypotheses << hypothesis;
qDebug() << "confidence = " << hypothesis.confidence << "\n Your Results = "<< hypothesis.utterance;
setResults(hypothesis.utterance);
}
}
void SpeechRecognition::setResults(const QString &results)
{
if(m_results == results)
return;
m_results = results;
emit resultsChanged();
}
QString SpeechRecognition::results()const
{
return m_results;
}
speechrecognition.h
#ifndef SPEECHRECOGNITION_H
#define SPEECHRECOGNITION_H
#include <QObject>
#include <QList>
class QIODevice;
class QNetworkAccessManager;
class QNetworkReply;
class SpeechRecognition : public QObject {
Q_OBJECT
Q_PROPERTY(QString results READ results NOTIFY resultsChanged)
public:
SpeechRecognition( QObject* parent = 0);
static const char* kUrl;
static const char* kContentType;
struct Hypothesis {
QString utterance;
qreal confidence;
};
typedef QList<Hypothesis> Hypotheses;
// This enumeration follows the values described here:
// http://www.w3.org/2005/Incubator/htmlspeech/2010/10/google-api-draft.html#speech-input-error
enum Result {
Result_Success = 0,
Result_ErrorAborted,
Result_ErrorAudio,
Result_ErrorNetwork,
Result_NoSpeech,
Result_NoMatch,
Result_BadGrammar
};
Q_INVOKABLE void start();
void Cancel();
QString results()const;
void setResults(const QString &results);
signals:
void Finished(Result result, const Hypotheses& hypotheses);
void resultsChanged();
private slots:
void replyFinished(QNetworkReply* reply);
private:
void ParseResponse(QIODevice* reply, Result* result, Hypotheses* hypotheses);
private:
QNetworkAccessManager* network_;
QNetworkReply* reply_;
QByteArray buffered_raw_data_;
int num_samples_recorded_;
QString m_results;
};
#endif // SPEECHRECOGNITION_H
Теоретически вы можете использовать Twilio, если у вас есть подключение к Интернету в роботе и вы готовы платить за услугу. У них есть библиотеки и примеры для разных языков и платформ. http://www.twilio.com/docs/libraries
Также ознакомьтесь с этим блогом, в котором объясняется, как создавать и управлять роботом на базе Arduino с помощью Twilio. http://www.twilio.com/blog/2012/06/build-a-phone-controlled-robot-using-node-js-arduino-rn-xv-wifly-arduinoand-twilio.html