и снова dll и маркет - страница 13

 
nkaretnikov:

проиграть wav файл из песочницы без DLL невозможно?

из справки

Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала\MQL5\Files, то вызов PlaySound() должен быть записан таким образом:

//--- проиграем звуковой файл Demo.wav из папки каталог_данных_терминала\MQL5\Files\
   PlaySound("\\Files\\Demo.wav");

проблема в том что сам движок playsound ущербный. он не совмещает звуки, а прекращает играть предыдущий, как только поступает новая команда.

в маркете есть требование что продукт должен работать из коробки, не зависеть от сторонних модулей. но можно сделать ход конем - сделать коробочное решение на костыле playsound а при наличии какого-то модуля, выложенного например в кодобазе, использовать нормальное решение через виндовый движок. который я так понимаю и распознавание текста тоже умеет.

 
nkaretnikov:

Вы я вижу человек с опытом, поможете написать пример обращения через сокет? 

Документация тут https://cloud.ibm.com/docs/text-to-speech?topic=text-to-speech-usingWebSocket

 instance_id я так, понимаю, равен GR1bb3zVMs9fcNKL6pA9-5zj9ptWliCu6eh9oupUnpZB

Пока курю доку...

Что именно у Вас не получается с запросом? В документации есть хорошие примеры.

Разбираться с протоколом говорилки сейчас нет времени, да и бесполезная это вещь.

Что касается Вашей ссылки - если можно не использовать WebSocket - лучше не используйте, сэкономите кучу времени (ели нет опыта работы с ним). Там кроме вебсокета есть и другие варианты.

Документация по MQL5: Сетевые функции / SocketCreate
Документация по MQL5: Сетевые функции / SocketCreate
  • www.mql5.com
//|                                                SocketExample.mq5 | //|                        Copyright 2018, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Отправка команды на сервер                                       |...
 
Andrei Trukhanovich:

из справки

Например, если звуковой файл Demo.wav лежит в папке каталог_данных_терминала\MQL5\Files, то вызов PlaySound() должен быть записан таким образом:

//--- проиграем звуковой файл Demo.wav из папки каталог_данных_терминала\MQL5\Files\
   PlaySound("\\Files\\Demo.wav");

проблема в том что сам движок playsound ущербный. он не совмещает звуки, а прекращает играть предыдущий, как только поступает новая команда.

в маркете есть требование что продукт должен работать из коробки, не зависеть от сторонних модулей. но можно сделать ход конем - сделать коробочное решение на костыле playsound а при наличии какого-то модуля, выложенного например в кодобазе, использовать нормальное решение через виндовый движок. который я так понимаю и распознавание текста тоже умеет.

вот и я о том же! )

Да, 2 способа.

1й способ - PlaySound и паузы из расчета скорости произнесения. Но с этим я столкнулся и на этапе вызова родных Windows TTS возможностей, при попадании в занятый поток второй фразы получаем ошибку времени выполнения. Поэтому, в классе есть задержка из расчета скорости воспроизведения в 100 символов в минуту. В принципе выходим из ситуации

2й способ - Формировать закрытым кодом тестовый файл, а открытым кодом с разрешенными DLL его воспроизводить

 
Serhii Shevchuk:

Зачем лишний раз что-то писать в папку? PlaySound может играть из ресурсов, см. абзац "Использование ресурсов" по ссылке

P.S. Сам не пробовал, но раз в документации написано, значит можно

Дык, ТС ведь хочет универсальное решение, при котором не нужно заранее интегрировать звуковые ресурсы в советник. Он хочет спроектировать систему взаимодействия советника и сервера, при которой первый формирует текствый файл из слов, которые СЕЙЧАС нужно сказать пользователю, а сервер их конвертирует в .wav и отсылает обратно в советник. Далее, советник неведомым образом, записывает файл на место прежнего файла (с предыдущей озвучкой от сервера) и вызывает PlaySound для воспроизведения новой озвучки.

Такая схема работать не может.
 
Реter Konow:
Дык, ТС ведь хочет универсальное решение, при котором не нужно заранее интегрировать звуковые ресурсы в советник. Он хочет, чтобы спроектировать систему взаимодействия советника и сервера, при котором первый формирует текствый файл из слов, которые СЕЙЧАС нужно сказать пользователю, сервер их конвертирует в .wav и отсылает обратно в советник. Далее, советник неведомым образом, записывает файл на место прежнего файла (с предыдущей озвучкой от сервера) и вызывает PlaySound для воспроизведения новой озвучки.

Такая схема работать не может.

Я имел ввиду использование ResourceCreate

Создать ресурс из принятых данных. И потом играть его PlaySound-ом. Но именно такую связку я в примерах не нашёл (не уверен, что будет работать). Поэтому удалил предыдущее сообщение.

Документация по MQL5: Общие функции / ResourceCreate
Документация по MQL5: Общие функции / ResourceCreate
  • www.mql5.com
[in]  Относительный путь к файлу, содержащему данные для ресурса. Если путь начинается с обратной косой черты "\" (пишется "\\"), то файл ищется относительно папки Если второй вариант функции вызывается для...
 
Serhii Shevchuk:

Я имел ввиду использование ResourceCreate

Создать ресурс из принятых данных. И потом играть его PlaySound-ом. Но именно такую связку я в примерах не нашёл (не уверен, что будет работать). Поэтому удалил предыдущее сообщение.

Прикольная идея. Можно попробывать, хоть и не уверен.)))
 
Serhii Shevchuk:

Что именно у Вас не получается с запросом? В документации есть хорошие примеры.

Разбираться с протоколом говорилки сейчас нет времени, да и бесполезная это вещь.

Что касается Вашей ссылки - если можно не использовать WebSocket - лучше не используйте, сэкономите кучу времени (ели нет опыта работы с ним). Там кроме вебсокета есть и другие варианты.

вот что не получается https://www.mql5.com/ru/forum/342293/page12#comment_16633648 

Файл создается, но пустой. Его имя



отличается от файла, который скачивается curl командой



Это как бы намекает, что написанный код 

//+------------------------------------------------------------------+
//|                                                   WebRequest.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string cookie=NULL,headers;
   char   post[],result[];
   char cost_char_data[];
   string  result_headers;
   
   headers = headers + "-u apikey:GR1bb3zVMs9fcNKL6pA9-5zj9ptWliCu6eh9oupUnpZB";
   headers = headers + " --header \"Content-Type: application/json\"";
   headers = headers + " --header \"Accept: audio/wav\"";
   headers = headers + " --data \"{\"text\":\"hello world\"}\"";
   headers = headers + " --output hello_world.wav";
//output hello_world.wav ^

   string url="https://api.eu-gb.text-to-speech.watson.cloud.ibm.com";
//--- для работы с сервером необходимо добавить URL "https://finance.yahoo.com"
//--- в список разрешенных URL (Главное меню->Сервис->Настройки, вкладка "Советники"):
//--- обнуляем код последней ошибки
   ResetLastError();
//--- загрузка html-страницы с Yahoo Finance
   int res = WebRequest("POST",url,headers,1000,cost_char_data,result,result_headers);
   if(res==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(res==200)
        {
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         //PrintFormat("Заголовки сервера: %s",headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("output hello_world.wav",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,result,0,ArraySize(result));
            //--- закрываем файл
            FileClose(filehandle);
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,res);
     }
  }
//+------------------------------------------------------------------+


неправильно формирует синтаксис WebRequest. 

Т.е. не получается заставить WebRequest делать то же, что делает curl 

и снова dll и маркет
и снова dll и маркет
  • 2020.05.31
  • www.mql5.com
День добрый! Правило №1 dll на Маркете запрещен...
 
Nikolai Karetnikov:

вот что не получается https://www.mql5.com/ru/forum/342293/page12#comment_16633648 

.....

Могу посмотреть, но не раньше, чем завтра вечером. Если сами до того времени не разберетесь.

 
Если звуковой файл может воспроизводится из папки Files, куда предварительно записываться советником, то решение задачи будет реальным, если полученный звуковой файл будет целостным. 
 
Nikolai Karetnikov:

вот что не получается https://www.mql5.com/ru/forum/342293/page12#comment_16633648 

Файл создается, но пустой. Его имя



отличается от файла, который скачивается curl командой



Это как бы намекает, что написанный код 


неправильно формирует синтаксис WebRequest. 

Т.е. не получается заставить WebRequest делать то же, что делает curl 

и не выйдет :-) 

зачем вы в HTTP заголовки передаёте опции команд curl ???

блин, ну хоть почитайте книжек, полистайте примерчиков...а то действительно, мы всем кагалом пишем вам статью