Russian Qt Forum
Май 06, 2024, 14:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Mirosoft SAPI.SpFileStream  (Прочитано 6264 раз)
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, тоже глухо...
Записан
santaclaus
Гость
« Ответ #1 : Октябрь 09, 2012, 14:12 »

Еще дополню!
Саму функцию вызываю как:
Код:
sapi->setProperty("AudioOutputStream", sapiFileStream->asVariant());

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

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

И при присвоение все время возвращает ложь....вот щас задумался как конвертировать то правильно или передать?
Записан
CMorgan
Гость
« Ответ #2 : Октябрь 25, 2012, 11:17 »

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

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

Проверь что возвращает QVariant v=sapiFileStream->asVariant(); По идее должно быть не пустым. У Троллей в какой-то из QTх была трабла с преобразованием QAxObject (или QAxWidget) в QVariant.
Если с вариантом все будет намано, то ты наверно передаешь не тот QAxObject, который ожидает AudioOutputStream, тогда получить указатель на AudioOutputStream и порыться в нем посмотреть что он хочет.
« Последнее редактирование: Октябрь 26, 2012, 12:35 от CMorgan » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.079 секунд. Запросов: 20.