Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Распознавание речи с помощью яндерса.
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
MishaUA
Доброго времени суток!
Хочу сделать расспознавание речи с помощью 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 мин получилось.
call_me_Frank
может быть "audio/x-pcm;bit=16;rate=8000"? или порядок байт другой поставить.
+ у тебя разные форматы приведены в конструкторе и on_send_clicked() (pcm vs. x-pcm)
MishaUA
Не подскажете, как конвентировать pcm в x-pcm? Я о последнем даже информации в инете не нахожу. Может у этого чормата есть второе название?
MishaUA
Косяк был в том, что нужно указывать размер данных (у меня bit=16)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.