并再次进行dll和营销 - 页 31

 
Andrei Trukhanovich:

我的观点是,这并不重要。

你的代码(几乎)适用于俄文)。

注意力已经睡着了,显然))。

 
Реter Konow:

不客气!

顺便说一句,我们需要告诉TC,这个人。

一个非常奇怪的条目。为什么要以这种奇怪的方式指定帖子阵列的大小。StringToCharArray 函数为动态数组本身设置了正确的大小。ArrayResize在这里似乎是多余 的。

这正是我所理解的。

MQL5 参考 / 数据转换 / StringToCharArray

终端0也将被复制到目标数组中,动态数组的 大小可以根据需要增加以适应字符串的大小。

 
Nikolai Karetnikov:

这正是清楚的事情。

MQL5 参考 / 数据转换 / StringToCharArray

终端0也将被复制到接受者数组中,如果有必要,动态数组的 大小可以增加以适应字符串的大小。

我当然不是一个编码专家,但你是否通过反复调用执行字符串到字符转换的函数来改变数组的大小?)

你可以这样做。

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

否则,我们就会调用同一个字符串的转换两次。此外,第二次取消了第一次。

 

另外,注意文档中的 "或 "字。

[in] 要复制的数组元素的数量。定义了结果字符串的长度。 默认值是-1,这意味着复制到数组的末端,或者 遇到终端0,终端0也将被复制到目标数组,如果需要,动态数组的 大小可以增加,以匹配字符串的大小。如果动态数组的大小大于字符串的长度,数组的大小将不会被减少。

我们不知道这个终端null是否存在,但是我们减少了数组后的大小,所以如果没有终端null,我们可能会失去收尾括号。

值得通过反向转换来检查字符转换后的字符串的完整性。

 
我成功了!说 "一、二"))
 
#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);
     }
  }
 
一、二、三、四、五,小兔子去散步了! ))))
 
TC,你做到了。这是你的成功!只有代码中的一个小错误被遗漏了。我把它修好了,成功了!))))
 
现在,我建议掌握STT(peach to text),为EA创造语音控制。该方案是相同的:连接到一些云服务(例如谷歌),并使用WebRequest 从转换后的语音中请求一个 "实时 "文本流,然后我们将其解析并发送给功能。其结果是非常创新的。
 
Реter Konow:
一、二、三、四、五,小兔子去散步了! ))))

是的!它起作用了!!酷

只需要更多这样的Jasop.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...
附加的文件:
result.zip  126 kb