et encore dll et marché - page 31

 
Andrei Trukhanovich:

Ce que je veux dire, c'est que ça n'a pas d'importance.

votre code fonctionne (presque) pour le russe).

La capacité d'attention s'est endormie, apparemment ;))

 
Реter Konow:

Vous êtes les bienvenus !

Au fait, nous devons dire à TC que celui-ci :

Une entrée très étrange. Pourquoi spécifier la taille du tableau des messages d'une manière aussi étrange. La fonctionStringToCharArray fixe la bonne taille au tableau dynamique lui-même.ArrayResize semble être superflu ici.

C'est exactement ce que je comprends.

Référence MQL5 / Conversion des données / StringToCharArray

La borne 0 sera également copiée dans le tableau cible, et la taille du tableau dynamique peut être augmentée si nécessaire pour s'adapter à la taille de la chaîne.

 
Nikolai Karetnikov:

c'est exactement ce qui est clair

Référence MQL5 / Conversion des données / StringToCharArray

La borne 0 sera également copiée dans le tableau du destinataire et la taille du tableau dynamique peut être augmentée pour s'adapter à la taille de la chaîne, si nécessaire.

Je ne suis certainement pas un pédant en codage, mais modifiez-vous la taille du tableau en appelant de manière répétée la fonction qui effectue la conversion des chaînes en caractères ?))))

Tu pourrais le faire :

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

Sinon, nous appelons deux fois la conversion de la même chaîne. De plus, le deuxième temps annule le premier.

 

Notez également le mot "ou" dans la documentation :

[in] Nombre d'éléments du tableau à copier. Définit la longueur de la chaîne de résultats. La valeur par défaut est -1, ce qui signifie copier jusqu'à la fin du tableau, ou rencontrer la borne 0. La borne 0 sera également copiée dans le tableau de destination, et la taille du tableau dynamique peut être augmentée pour correspondre à la taille de la chaîne si nécessaire. Si la taille du tableau dynamique est supérieure à la longueur de la chaîne, alors la taille du tableau ne sera pas réduite.

Nous ne savons pas si ce nul terminal est présent ou non, mais nous réduisons la taille du post du tableau, donc nous pouvons perdre le crochet de fermeture si aucun nul terminal n'est présent.

Il est utile de vérifier l'intégrité de la chaîne convertie en caractères par conversion inverse.

 
Je l'ai fait ! Il a dit "un, deux"))
 
#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);
     }
  }
 
Un, deux, trois, quatre, cinq, le lapin est parti en promenade ! ))))
 
TC, tu l'as fait. C'est votre succès ! Seule une petite erreur dans le code a été manquée. Je l'ai réparé et ça a marché ! ))))
 
Maintenant, je suggère de maîtriser le STT (speach to text) pour créer un contrôle vocal pour l'EA. Le principe est le même : on se connecte à un service en nuage (Google, par exemple) et on utilise WebRequest pour demander un flux de texte "en direct" à partir de la parole convertie, que nous analysons ensuite et envoyons à la fonctionnalité. Le résultat est très innovant.
 
Реter Konow:
Un, deux, trois, quatre, cinq, le lapin est parti en promenade ! ))))

Oui ! ça marche ! !! cool

J'ai juste besoin de plus de ceJasop.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...
Dossiers :
result.zip  126 kb