y de nuevo dll y el mercado - página 31

 
Andrei Trukhanovich:

mi punto es que no importa.

tu código (casi) funciona para el ruso).

la capacidad de atención se ha dormido, aparentemente ))

 
Реter Konow:

De nada.

Por cierto, tengo que decirle a TC que este:

Una entrada muy extraña. Por qué especificar el tamaño del array de correos de una manera tan extraña. La funciónStringToCharArray establece el tamaño correcto del propio array dinámico.ArrayResize parece ser superfluo aquí.

Esto es exactamente lo que yo entiendo.

MQL5 Reference / Data Conversion / StringToCharArray

El terminal 0 también se copiará en la matriz de destino, y el tamaño de la matriz dinámica puede aumentarse según sea necesario para ajustarse al tamaño de la cadena.

 
Nikolai Karetnikov:

esto es exactamente lo que está claro.

MQL5 Reference / Data Conversion / StringToCharArray

El terminal 0 también se copiará en la matriz receptora y el tamaño de la matriz dinámica puede aumentarse para ajustarse al tamaño de la cadena, si es necesario.

Ciertamente no soy un pedante de la codificación, pero ¿estás cambiando el tamaño de la matriz llamando repetidamente a la función que realiza la conversión de cadena a carácter))

Podrías hacerlo:

  int q = StringToCharArray(jsonbody,post,0,-1,CP_UTF8);
  ArrayResize(post, q - 1);

De lo contrario, estamos llamando a la conversión de la misma cadena dos veces. Además, la segunda vez anula la primera.

 

Además, tenga en cuenta la palabra "o" en la documentación:

[in] Número de elementos del array a copiar. Define la longitud de la cadena de resultados. El valor por defecto es -1, lo que significa copiar hasta el final del array, o encontrarse con el terminal 0. El terminal 0 también se copiará en el array de destino, y el tamaño del array dinámico se puede aumentar para que coincida con el tamaño de la cadena si es necesario. Si el tamaño de la matriz dinámica es mayor que la longitud de la cadena, el tamaño de la matriz no se reducirá.

No sabemos si este nulo terminal está ahí o no, pero reducimos el tamaño del post del array, por lo que podemos perder el corchete de cierre si no hay nulo terminal.

Merece la pena comprobar la integridad de la cadena convertida en char mediante la conversión inversa.

 
¡Lo hice! Dijo "uno, dos"))
 
#include <JAson.mqh>
void OnStart()
  {

   char    result[];
   char    post[];
   string  url="https://texttospeech.googleapis.com/v1/text:synthesize?key=AIzaSyCaLxPh84wXpLkT-zOE04MlvHj3JhLXU0w";
   string  headers;
   string  result_headers;
   int     status;
   
   
   string jsonbody;
   headers = "Content-Type: application/json";


  jsonbody = "{\"input\":{\"text\":\"one, two\"},\"voice\":{\"languageCode\":\"en-gb\",\"name\":\"en-GB-Wavenet-B\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}";  
  jsonbody = "{\"input\":{\"text\":\"раз, два, три, четыре, пять, вышел зайчик погулять\"},\"voice\":{\"languageCode\":\"ru-RU\",\"name\":\"ru-RU-Wavenet-B\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}";

 
   
  int q = StringToCharArray(jsonbody,post,0,-1,CP_UTF8);
  ArrayResize(post, q - 1);
  status=WebRequest("POST",url,headers,100000,post,result,result_headers);

   
   if(status==-1)
     {
      Print("Ошибка в WebRequest. Код ошибки  =",GetLastError());
      //---
      StringSetLength(url,StringFind(url,"/",8));
      MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
     }
   else
     {
      if(status==200)
        {
        CJAVal  CJasonResult;
        string lBase64String;
        char lBase64ResultArray[];
        char lBinaryDataArray[];
        char lkey[1];


        CJasonResult.Deserialize(result);
        lkey[0]=0;
        lBase64String = CJasonResult["audioContent"].ToStr();
        StringToCharArray(lBase64String,lBase64ResultArray,0,StringLen(lBase64String));
        CryptDecode(CRYPT_BASE64,lBase64ResultArray,lkey,lBinaryDataArray);
         //--- успешная загрузка
         PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
         PrintFormat("Заголовки сервера: %s",result_headers);
         //--- сохраняем данные в файл
         int filehandle=FileOpen("result.wav",FILE_WRITE|FILE_BIN);
         if(filehandle!=INVALID_HANDLE)
           {
           
            //--- сохраняем содержимое массива result[] в файл
            FileWriteArray(filehandle,lBinaryDataArray,0,ArraySize(result));

            //--- закрываем файл
            FileClose(filehandle);
            PlaySound("\\Files\\result.wav");
           }
         else
            Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
        }
      else
         PrintFormat("Ошибка загрузки '%s', код %d",url,status,result_headers);
     }
  }
 
Uno, dos, tres, cuatro, cinco, ¡el conejo salió a pasear! ))))
 
TC, lo hiciste. Este es su éxito. Sólo se ha perdido un pequeño error en el código. Lo he arreglado y ha funcionado! ))))
 
Ahora, sugiero dominar el STT (speach to text) para crear un control de voz para el EA. El esquema es el mismo: conectarse a algún servicio en la nube (Google, por ejemplo) y utilizar WebRequest para solicitar un flujo de texto "en vivo" del discurso convertido, que luego parseamos y enviamos a la funcionalidad. El resultado es muy innovador.
 
Реter Konow:
Uno, dos, tres, cuatro, cinco, ¡el conejo salió a pasear! ))))

¡Sí! ¡Funciona! ¡Genial!

Sólo necesito más de estoJasop.mqh

JP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Файл успешно загружен, размер 264457 байт.
MQ      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Заголовки сервера: Content-Type: application/json; charset=UTF-8
DH      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: Origin
EN      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: X-Origin
OD      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Vary: Referer
IO      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Content-Encoding: gzip
ID      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Date: Wed, 03 Jun 2020 02:05:48 GMT
MO      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Server: ESF
GE      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Cache-Control: private
EP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-XSS-Protection: 0
MD      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-Frame-Options: SAMEORIGIN
CR      0       05:05:49.668    22WebRequest (GBPNZD,H2)        X-Content-Type-Options: nosniff
PP      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Alt-Svc: h3-27=":443"; ma=2592000,h3-25=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q049=":443"; ma=2592000,h3-Q048=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
QL      0       05:05:49.668    22WebRequest (GBPNZD,H2)        Transfer-Encoding: chunked
LI      0       05:05:49.668    22WebRequest (GBPNZD,H2)
JSON Serialization and Deserialization (native MQL)
JSON Serialization and Deserialization (native MQL)
  • www.mql5.com
ForecastOscilator_HTF The ForecastOscilator indicator with the timeframe selection option available in the input parameters. Flat_HTF The Flat indicator with the timeframe selection option available in the input parameters. FX5_SelfAdjustingRSI_HTF The...
Archivos adjuntos:
result.zip  126 kb