crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Распознавание речи с помощью яндерса., Не получается передать звук на сервер.
MishaUA
  опции профиля:
сообщение 19.4.2015, 2:36
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Доброго времени суток!
Хочу сделать расспознавание речи с помощью 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 мин получилось.

Сообщение отредактировал MishaUA - 19.4.2015, 2:18
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
call_me_Frank
  опции профиля:
сообщение 20.4.2015, 10:08
Сообщение #2


Студент
*

Группа: Участник
Сообщений: 73
Регистрация: 20.10.2010
Пользователь №: 2129

Спасибо сказали: 0 раз(а)




Репутация:   0  


может быть "audio/x-pcm;bit=16;rate=8000"? или порядок байт другой поставить.
+ у тебя разные форматы приведены в конструкторе и on_send_clicked() (pcm vs. x-pcm)

Сообщение отредактировал call_me_Frank - 20.4.2015, 10:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 21.4.2015, 21:53
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Не подскажете, как конвентировать pcm в x-pcm? Я о последнем даже информации в инете не нахожу. Может у этого чормата есть второе название?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 21.4.2015, 23:43
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Косяк был в том, что нужно указывать размер данных (у меня bit=16)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 7:48