Хочу сделать расспознавание речи с помощью Yandex SpeechKit Cloud API. Звук записываю с помощью QAudioInput в формат audio/pcm, пробовал выводить через QAudioOutput - запись проигрывается, значит записало нормально.
Яндексу передаю вот так:
file->open(QIODevice::ReadOnly);
QNetworkRequest req;
req.setUrl(QUrl("https://asr.yandex.net/asr_xml?uuid=01ae13cb744628b58fb116d454daa1e8&key=мой_ключ&topic=queries&lang=ru-RU"));
req.setHeader(QNetworkRequest::ContentTypeHeader, "audio/x-pcm");
req.setHeader(QNetworkRequest::ContentLengthHeader, file->size());
net->post(req, file);
Но сервер возвращяет "Unknown Content-Type or multipart/form-data expected!". Что значит эта ошибка, я так и не понял. Пытался в Content-Type подставлять разную информацию, но безрезультатно, всегда возвращает эту ошибку. Полный исходник:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QApplication>
#include <QDebug>
#include <QTimer>
#include <QNetworkRequest>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
file = new QFile(this); // class member.
file->setFileName(qApp->applicationDirPath() + "/test.raw");
QAudioFormat format;
// set up the format you want, eg.
format.setSampleRate(8000);
format.setChannelCount(1);
format.setSampleSize(16);
format.setCodec("audio/pcm");
format.setByteOrder(QAudioFormat::LittleEndian);
format.setSampleType(QAudioFormat::UnSignedInt);
QAudioDeviceInfo info = QAudioDeviceInfo::defaultInputDevice();
if (!info.isFormatSupported(format)) {
qDebug() << "default format not supported try to use nearest";
format = info.nearestFormat(format);
}
audio = new QAudioInput(format, this);
audioOutput = new QAudioOutput(format, this);
net = new QNetworkAccessManager(this);
connect(net, SIGNAL(finished(QNetworkReply*)), SLOT(netFinished(QNetworkReply*)));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_start_clicked()
{
qDebug() << "start";
file->open( QIODevice::WriteOnly | QIODevice::Truncate );
audio->start(file);
}
void MainWindow::on_stop_clicked()
{
qDebug() << "stop";
audio->stop();
file->close();
}
void MainWindow::on_play_clicked()
{
file->open(QIODevice::ReadOnly);
connect(audioOutput,SIGNAL(stateChanged(QAudio::State)),SLOT(finishedPlaying(QAudio::State)));
audioOutput->start(file);
}
void MainWindow::finishedPlaying(QAudio::State state)
{
if (state == QAudio::IdleState) {
audioOutput->stop();
file->close();
}
}
void MainWindow::on_send_clicked()
{
file->open(QIODevice::ReadOnly);
QNetworkRequest req;
req.setUrl(QUrl("https://asr.yandex.net/asr_xml?uuid=01ae13cb744628b58fb116d454daa1e8&key=мой_ключ&topic=queries&lang=ru-RU"));
req.setHeader(QNetworkRequest::ContentTypeHeader, "audio/x-pcm");
req.setHeader(QNetworkRequest::ContentLengthHeader, file->size());
net->post(req, file);
}
void MainWindow::netFinished(QNetworkReply *r)
{
qDebug() << "finished" << r->readAll();
r->deleteLater();
file->close();
}
void MainWindow::netError()
{
qDebug() << "error";
}
Собственно, судя по тексту ошибки, я ему передл не верный тип, но в доке яндекса указан именно этот.
Подскажите, пожалуйста, где ошибка?
Только что попробовал через гугл - за 15 мин получилось.