“文本转语音”和“语音转文本”的 C++ API

问题描述 投票:0回答:4

想知道C++有没有好的“语音识别”和“文字转语音”的API。我经历了Festival,你甚至不能说电脑是否在说话,因为它是如此真实,而且voce也是如此。

不幸的是

Festival
似乎不支持语音识别(我的意思是“语音到文本”)并且
voce
是用Java构建的并且由于JNI而在C ++中一团糟。

API 应该同时支持“文本到语音”和“语音到文本”,并且应该有一组很好的示例,至少在所有者的网站之外。如果它能够识别一组给定的声音,那就完美了,但这是可选的,所以不用担心。

我要用 API 做的是,当给出一组语音命令时,向左、向右转动机器人设备等。同时,对我说“早安”、“晚安”等。这些词将在程序中编码。

请帮助我为此目的找到一个好的 C++ 语音 API。如果您有教程/安装教程,请也分享给我。

c++ qt artificial-intelligence voice voice-recognition
4个回答
5
投票

我发现如果我录制音频(为此我使用了 qtmultimedia)必须是 flac 在这里阅读更多

然后我可以上传到谷歌,然后让它给我发回一些 JSON
然后我为此写了一些 c++/qt 来制作一个 qml 插件 这是那个(alpha)代码。注意确保你更换
< YOUR FLAC 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

1
投票

如果您在 Windows 上开发,您可以使用 MS 语音 API,它允许您执行语音识别 (ASR) 和文本转语音 (TTS)。
您可以在 this page 上找到一些示例,在 this post 中找到一个非常基本的语音识别示例。


0
投票

如果你的机器人有互联网连接并且愿意为服务付费,理论上你可以使用 Twilio。他们有许多不同语言和平台的库和示例http://www.twilio.com/docs/libraries

此外,查看此博客,解释如何使用 Twilio 构建和控制基于 arduino 的机器人http://www.twilio.com/blog/2012/06/build-a-phone-controlled-robot-using-node- js-arduino-rn-xv-wifly-arduinoand-twilio.html


0
投票

对于语音识别部分,请参阅Georgi Gerganov git project using OpenAI Whisper。它离线工作(在 Apple、Linux、Windows 上),从文件加载模型,它可以将音频文件转换为文本,或者它可以从麦克风实时转换音频。我引用自 readme.md:

》OpenAI的Whisper自动语音识别(ASR)模型的高性能推理:

  • 无依赖的纯 C/C++ 实现
  • Apple silicon 一等公民 - 通过 ARM NEON、Accelerate 框架和 Core ML 进行优化
  • AVX intrinsics 支持 x86 架构
  • ……”

对于文本转语音部分,请参阅Ahmad Anis 页面,了解 C++ 中的文本转语音

“文本转语音是机器学习的一种常见实现,实际上已经构建了许多使用文本转语音的出色机器学习应用程序。只需导入一些预定义的模型并使用 C++ 中的文本转语音就容易多了他们。”

它适用于 Windows 和 Linux(通过 wine)。我引用包含代码git页面:

" 它与 Microsoft Sapi 一起工作,并为您提供以 Normal 、 2x 、 -2x 输出语音的选项"

这意味着它使用Microsoft Speech API (SAPI) 5.3.

© www.soinside.com 2019 - 2024. All rights reserved.