e di nuovo dll e mercato - pagina 31

 
Andrei Trukhanovich:

Il mio punto è che non ha importanza.

il tuo codice (quasi) funziona per il russo).

la capacità di attenzione si è addormentata, a quanto pare ))

 
Реter Konow:

Prego!

A proposito, dobbiamo dire a TC che questo:

Una voce molto strana. Perché specificare la dimensione dell'array di post in un modo così strano. La funzioneStringToCharArray imposta la giusta dimensione all'array dinamico stesso.ArrayResize sembra essere superfluo qui.

Questo è esattamente quello che ho capito.

Riferimento MQL5 / Conversione dati / StringToCharArray

Anche il terminale 0 sarà copiato nell'array di destinazione, e la dimensione dell'array dinamico può essere aumentata come necessario per adattarsi alla dimensione della stringa.

 
Nikolai Karetnikov:

questo è esattamente ciò che è chiaro

Riferimento MQL5 / Conversione dati / StringToCharArray

Il terminale 0 sarà anche copiato nell'array ricevente e la dimensione dell'array dinamico può essere aumentata per adattarsi alla dimensione della stringa, se necessario.

Non sono certo un pedante del codice, ma stai cambiando la dimensione dell'array chiamando ripetutamente la funzione che esegue la conversione da stringa a carattere?)))

Potresti farlo:

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

Altrimenti, stiamo chiamando due volte la conversione della stessa stringa. Inoltre, la seconda volta annulla la prima.

 

Inoltre, notate la parola "o" nella documentazione:

[in] Numero di elementi della matrice da copiare. Definisce la lunghezza della stringa del risultato. Il valore predefinito è -1, che significa copiare alla fine dell'array, o incontrare il terminale 0. Anche il terminale 0 sarà copiato nell'array di destinazione, e la dimensione dell'array dinamico può essere aumentata per corrispondere alla dimensione della stringa, se necessario. Se la dimensione dell'array dinamico è maggiore della lunghezza della stringa, allora la dimensione dell'array non verrà ridotta.

Non sappiamo se questo null terminale c'è o no, ma riduciamo la dimensione del post dell'array, quindi potremmo perdere la parentesi di chiusura se non c'è nessun null terminale.

Vale la pena controllare l'integrità della stringa convertita in caratteri tramite la conversione inversa.

 
L'ho fatto! Ha detto "uno, due"))
 
#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, due, tre, quattro, cinque, il coniglietto è andato a fare una passeggiata! ))))
 
TC, ce l'hai fatta. Questo è il tuo successo! Solo un piccolo errore nel codice è stato mancato. L'ho aggiustato e ha funzionato! ))))
 
Ora, suggerisco di padroneggiare STT (speach to text) per creare un controllo vocale per l'EA. Lo schema è lo stesso: connettersi a qualche servizio cloud (Google, per esempio) e utilizzare WebRequest per richiedere un flusso di testo "live" dal discorso convertito, che poi analizziamo e inviamo alla funzionalità. Il risultato è molto innovativo.
 
Реter Konow:
Uno, due, tre, quattro, cinque, il coniglietto è andato a fare una passeggiata! ))))

Sì! Funziona!!! cool

solo bisogno di questoJasop.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...
File:
result.zip  126 kb