Russian Qt Forum

Qt => ActiveX => Тема начата: santaclaus от Октябрь 08, 2012, 14:24



Название: Mirosoft SAPI.SpFileStream
Отправлено: santaclaus от Октябрь 08, 2012, 14:24
Всем привет! Короче беда такая, есть голосовой движок который хорошо говорит.
В нем есть функция которая сохраняет звук в файлы...вот она что то ни как не хочет.
Может кто сталкивался или толкните куда копать...
Ну собственно код
Код:
    QAxObject* sapi = new QAxObject("SAPI.SpVoice", this); //сделали голос

    sapi->setProperty("Voice", sapi->querySubObject("GetVoices()")->querySubObject(QString("Item(").append(QString::number(0)).append(")").toAscii())->asVariant()); //выбрали женский
    sapi->setProperty("Rate", QString::number(-1)); //замедлили
    sapi->setProperty("Volume", 100); //громкость на всю

    QAxObject *sapiFileStream = new QAxObject("SAPI.SpFileStream"); //поток пишущий в файл
    sapiFileStream->dynamicCall(QString::fromUtf8("Open(test.wav, SSFMCreateForWrite, False)").toAscii()); //указали в какой файл
    sapi->setProperty("AudioOutputStream", sapiFileStream->asVariant()); //указали гооворилки что бы болтала в файл
    sapi->setProperty("WaitUntilDone", -1);//ожидаем окончания  болтовни

    sapi->dynamicCall("Speak(\"const QString& str\", SpeechVoiceSpeakFlags.SVSFlagsAsync)", QString::fromUtf8("Сохранение голоса в файл")); //начали говорить
    sapiFileStream->dynamicCall("Close()"); //закрыли файл
    sapi->setProperty("AudioOutputStream", "Nothing"); //убрали признак говорить в поток

    delete sapiFileStream;
    delete sapi;
Файл создается, но он всегда пустой, размер 1 килобайт и там только описание структуры wav. Пробовал делать через SpMemoryStream - что бы не в файл а в память писало, дальше читать в QByteArray, тоже глухо...


Название: Re: Mirosoft SAPI.SpFileStream
Отправлено: santaclaus от Октябрь 09, 2012, 14:12
Еще дополню!
Саму функцию вызываю как:
Код:
sapi->setProperty("AudioOutputStream", sapiFileStream->asVariant());

При этом из описания данное свойство должно иметь на входе некий IDispatch* AudioOutputStream;

Дальше, остальные функции принимают значения без проблем, где Int Bool и так далее, то есть, я так понимаю что мой второй параметр который выглядит как QAxObject->asVariant() близко не относится к IDispatch.

И при присвоение все время возвращает ложь....вот щас задумался как конвертировать то правильно или передать?


Название: Re: Mirosoft SAPI.SpFileStream
Отправлено: CMorgan от Октябрь 25, 2012, 11:17
Дальше, остальные функции принимают значения без проблем, где Int Bool и так далее, то есть, я так понимаю что мой второй параметр который выглядит как QAxObject->asVariant() близко не относится к IDispatch.

И при присвоение все время возвращает ложь....вот щас задумался как конвертировать то правильно или передать?

Проверь что возвращает QVariant v=sapiFileStream->asVariant(); По идее должно быть не пустым. У Троллей в какой-то из QTх была трабла с преобразованием QAxObject (или QAxWidget) в QVariant.
Если с вариантом все будет намано, то ты наверно передаешь не тот QAxObject, который ожидает AudioOutputStream, тогда получить указатель на AudioOutputStream и порыться в нем посмотреть что он хочет.