그리고 다시 dll과 시장 - 페이지 27

 
Alexsandr San :

여기 첫 번째 실행이 있습니다. 러시아어 텍스트가 포함된 텍스트 파일을 업로드했습니다. 일종의 낙서입니다. 하지만 파일을 .wav에 저장합니다.


복사 붙여넣기 - .wav 파일 수신 아카이브에서 .wav 로 작성하여 저장

스냅샷2

파일:
 
Nikolai Karetnikov :

글쎄, 구글에 대해

그들은 Base64에서 스트림을 제공합니다. mp3로 변환하는데 성공했는데 LINEAR16에서는 안되네요.

LINEAR16은 wav로 변환해야 합니다.

LINEAR16으로 반환된 오디오 콘텐츠에는 WAV 헤더도 포함되어 있습니다.
Method: text.synthesize  |  Cloud Text-to-Speech  |  Google Cloud
Method: text.synthesize  |  Cloud Text-to-Speech  |  Google Cloud
  • cloud.google.com
Synthesizes speech synchronously: receive results after all text input has been processed. Request body The request body contains data with the following structure: Fields Response body If successful, the response body contains data with the following structure: The message returned to the client by the method. Fields The audio data bytes...
 

전문가를 위한 질문

코드에서 Google 서비스 호출

Google

1. 단 하나의 헤더

2. url을 통해 키 전달

3. json 파일을 통해 엔진을 관리합니다.

컬에서는 이렇습니다

curl -X POST -H "Content-Type: application/json" -d @request.json https: //texttospeech.googleapis.com/v1/text:synthesize?key=AIzaSyCaLxPh84wXpLkT-zOE04MlvHj3JhLXU0w

요청.json

{ "input" :{ "text" : "M" }, "voice" :{ "languageCode" : "en-gb" }, "audioConfig" :{ "audioEncoding" : "LINEAR16" }}

curl이 올바른 응답을 얻습니다.



이제 WebRequest를 사용하여 구현합니다.


 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnStart ()
  {

   char     post[],result[];
   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" ;
//---

// original json file
//{"input":{"text":"M"},"voice":{"languageCode":"en-gb"},"audioConfig":{"audioEncoding":"LINEAR16"}}
////

  jsonbody = "{\"input\":{\"text\":\"M\"},\"voice\":{\"languageCode\":\"en-gb\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}" ;
   StringToCharArray (jsonbody,post);
  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 )
        {
         //--- успешная загрузка
         PrintFormat ( "Файл успешно загружен, размер %d байт." , ArraySize (result));
         PrintFormat ( "Заголовки сервера: %s" ,result_headers);
         //--- сохраняем данные в файл
         int filehandle= FileOpen ( "result.wav" , FILE_WRITE | FILE_BIN );
         if (filehandle!= INVALID_HANDLE )
           {
             //--- сохраняем содержимое массива result[] в файл
             FileWriteArray (filehandle,result, 0 , ArraySize (result));
             //--- закрываем файл
             FileClose (filehandle);
             PlaySound ( "\\Files\\test.mp3" );
           }
         else
             Print ( "Ошибка в FileOpen. Код ошибки =" , GetLastError ());
        }
       else
         PrintFormat ( "Ошибка загрузки '%s', код %d" ,url,status);
     }
  }

하지만 답은 온다

2020.06.02 11:52:15.887 GoogleVoice (EURUSD,H1) Ошибка загрузки 'https://texttospeech.googleapis.com/v1/text:synthesize?key=AIzaSyCaLxPh84wXpLkT-zOE04MlvHj3JhLXU0w', код 400

서버가 json 변수로 보낸 짧은 배열을 이해하지 못한 것처럼

배열을 잘못 형성했는지 여부, 여전히 무엇입니까?

 
TheXpert :

LINEAR16은 wav로 변환해야 합니다.

해야 한다! ) 그리고 주어진다.

이유 -

추가 문자를 제거하고 정리된 문자열을 Base64 유틸리티에 "공급"하면 PlaySound 가 읽을 수 있는 wav 파일이 생성됩니다.

 
Nikolai Karetnikov :

해야 한다! ) 그리고 주어진다.

이유 -

추가 문자를 제거하고 정리된 문자열을 Base64 유틸리티에 "피드"하면 PlaySound가 읽을 수 있는 wav 파일이 생성됩니다.

이것은 json :-) 친절하게도 audioContent 키로 값을 가져와야 합니다.

 
Nikolai Karetnikov :


읽지 못할 수 있으며 이를 위해

         int filehandle= FileOpen ( " result.wav " , FILE_WRITE | FILE_BIN );
         if (filehandle!= INVALID_HANDLE )
           {
             //--- сохраняем содержимое массива result[] в файл
             FileWriteArray (filehandle,result, 0 , ArraySize (result));
             //--- закрываем файл
             FileClose (filehandle);
             PlaySound ( "\\Files\\ test.mp3 " );
다른 파일 가져오기
 
Alexsandr San :

읽지 못할 수 있으며 이를 위해

다른 파일 가져오기

WebRequest 단계에서 프로그램 실행이 중단되고 파일이 도달하지 않습니다)))

 
Maxim Kuznetsov :

이것은 json :-) 친절하게도 audioContent 키로 값을 가져와야 합니다.

아, 바로! 감사해요!! )))

 
Nikolai Karetnikov :

하지만 답은 온다

서버가 json 변수로 보낸 짧은 배열을 이해하지 못한 것처럼

배열을 잘못 형성했는지 여부, 여전히 무엇입니까?

문제는 종료 null 문자입니다.

 void OnStart ()
  {

   char     post[],result[];
   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" ;
//---

// original json file
//{"input":{"text":"M"},"voice":{"languageCode":"en-gb"},"audioConfig":{"audioEncoding":"LINEAR16"}}
////

  jsonbody = "{\"input\":{\"text\":\"M\"},\"voice\":{\"languageCode\":\"en-gb\"},\"audioConfig\":{\"audioEncoding\":\"LINEAR16\"}}" ;
   ArrayResize (post, StringToCharArray (jsonbody,post) - 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 )
        {
         //--- успешная загрузка
         PrintFormat ( "Файл успешно загружен, размер %d байт." , ArraySize (result));
         PrintFormat ( "Заголовки сервера: %s" ,result_headers);
         //--- сохраняем данные в файл
         int filehandle= FileOpen ( "result.wav" , FILE_WRITE | FILE_BIN );
         if (filehandle!= INVALID_HANDLE )
           {
             //--- сохраняем содержимое массива result[] в файл
             FileWriteArray (filehandle,result, 0 , ArraySize (result));
             //--- закрываем файл
             FileClose (filehandle);
             PlaySound ( "\\Files\\test.mp3" );
           }
         else
             Print ( "Ошибка в FileOpen. Код ошибки =" , GetLastError ());
        }
       else
      {
         PrintFormat ( "Ошибка загрузки '%s', код %d" ,url,status);
         Print ( "result: " , CharArrayToString (result));
      }
     }
  }

webrequest 에서 오류가 발생하면 결과 매개변수에 많은 추가 정보가 있습니다.

예를 들어:

2020.06.02 12:29:27.935 google_speech (USDRUB,M30)      Ошибка загрузки 'https://texttospeech.googleapis.com/v1/text:synthesize?key=AIzaSyCaLxPh84wXpLkT-zOE04MlvHj3JhLXU0w', код 400
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)      result: {
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)        "error": {
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)          "code": 400,
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)          "message": "Invalid JSON payload received. Parsing terminated before end of input.\ncoding\":\"LINEAR16\"}}\u0000\n                    ^",
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)          "status": "INVALID_ARGUMENT"
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)        }
2020.06.02 12:29:27.935 google_speech (USDRUB,M30)      }
 
TheXpert :

문제는 종료 null 문자입니다.

webrequest 에서 오류가 발생하면 결과 매개변수에 많은 추가 정보가 있습니다.

예를 들어:

고맙습니다! )