Файлы размером больше ~ 7 Мб выбрасывает «Ответ не получен».на асинхронный вызов createJob IBM Watson Speech-To-Text - PullRequest
0 голосов
/ 19 мая 2019

Я работаю над транскрипцией текстовой речи на стороне сервера, и мне удалось заставить конечную точку, работающую на файлы меньшего размера, но все, что больше, чем ~ 7Mb, выдает ошибку, которая не имеет большого смысла для меня.

Я знаю, что этот код работает для небольших файлов и что URL обратного вызова зарегистрирован правильно.Я попытался добавить создание readableTranscriptStream в функцию setTimeout (), просто чтобы убедиться, что проблема не в том, что полный файл не был передан в вызов createJob.Я также попытался просто передать req.file.buffer в качестве аргумента для аудио-параметра.Я также знаю, что это не проблема неправильного кодирования файлов, так как я использовал один и тот же аудиофайл, медленно увеличивая длину и размер файла до тех пор, пока не возникла эта ошибка, и он работал, пока я не нажал7,2 Мб или ~ 3 мин звука в 16-битном кодированном файле .wav.

Я также пробовал это с fs.createFileStream ('./ local_test.wav') в качестве аргумента и получил ту же ошибку обратно, хотя, когда я пытался это сделать, поле _requestBodyLength в ошибке было 10485760и _requestBodyBuffers был массив объектов.Я понимаю, что это 10485760 - то же самое, что и maxBodyLength, но в документах по API говорится, что «Вы можете передать максимум 1 ГБ и минимум 100 байтов аудио с запросом», и тестовое аудио, опять же, ~ 7.2Мб.

       username: process.env.wastonUsername,
       password: process.env.watsonPassword,
       url: 'https://stream.watsonplatform.net/speech-to-text/api/'
     });

   const storage = multer.memoryStorage();
   const upload = multer({ storage: storage , limit: {fields: 1, fileSize: 209715200, files:1, parts:2}});

   upload.single('track')(req,res, (err) => {
       req.setTimeout(0);
       if (err) {
           console.log(err);
           return res.status(400).json({ message: err })
       }

       const registerCallbackParams = {
           callback_url: <my_callback_url>,
           user_secret: "Test"
       };

       const readableTranscriptStream = new Readable();
       readableTranscriptStream.push(req.file.buffer);
       readableTranscriptStream.push(null);

       const createJobParams = {
           audio: readableTranscriptStream,
           callback_url: <my_callback_url>,
           content_type: req.file.mimetype,
           events:"recognitions.completed_with_results",
           inactivity_timeout: -1
         };

       speechToText.createJob(createJobParams)
       .then(recognitionJob => {
           console.log(recognitionJob);
       })
       .catch(err => {
           console.log('error:', err);
       }); 
   }) 

Я получаю сообщение об ошибке:

error:{  
   Error:   Response not received. Body of error is HTTP ClientRequest object 
at formatError (/app/node_modules/ibm-cloud-sdk-core/lib/requestwrapper.js:111:17   ) 
at /app/node_modules/ibm-cloud-sdk-core/lib/requestwrapper.js:259:19   at process._tickCallback (internal/process/next_tick.js:68:7   ) 
message:'Response not received. Body of error is HTTP ClientRequest object',
   body:Writable   {  
      _writableState:WritableState      {  
         objectMode:false,
         highWaterMark:16384,
         finalCalled:false,
         needDrain:false,
         ending:false,
         ended:false,
         finished:false,
         destroyed:false,
         decodeStrings:true,
         defaultEncoding:'utf8',
         length:0,
         writing:false,
         corked:0,
         sync:true,
         bufferProcessing:false,
         onwrite:[  
            Function:bound onwrite
         ],
         writecb:null,
         writelen:0,
         bufferedRequest:null,
         lastBufferedRequest:null,
         pendingcb:0,
         prefinished:false,
         errorEmitted:false,
         emitClose:true,
         bufferedRequestCount:0,
         corkedRequestsFree:[  
            Object
         ]
      },
      writable:true,
      _events:[  
         Object:null         prototype
      ]      {  
         response:[  
            Function:handleResponse
         ],
         error:[  
            Function:handleRequestError
         ]
      },
      _eventsCount:2,
      _maxListeners:undefined,
      _options:{  
         maxRedirects:21,
         maxBodyLength:10485760,
         protocol:'https:',
         path:'/speech-to-text/api/v1/recognitions?callback_url=<my_callback_url>&events=recognitions.completed_with_results&inactivity_timeout=-1',
         method:'post',
         headers:[  
            Object
         ],
         agent:[  
            Agent
         ],
         auth:undefined,
         hostname:'stream.watsonplatform.net',
         port:null,
         nativeProtocols:[  
            Object
         ],
         pathname:'/speech-to-text/api/v1/recognitions',
         search:'?callback_url=<my_callback_url>&events=recognitions.completed_with_results&inactivity_timeout=-1'
      },
      _ended:false,
      _ending:true,
      _redirectCount:0,
      _redirects:[  

      ],
      _requestBodyLength:0,
      _requestBodyBuffers:[  

      ],
      _onNativeResponse:[  
         Function
      ],
      _currentRequest:ClientRequest      {  
         _events:[  
            Object
         ],
         _eventsCount:6,
         _maxListeners:undefined,
         output:[  

         ],
         outputEncodings:[  

         ],
         outputCallbacks:[  

         ],
         outputSize:0,
         writable:true,
         _last:true,
         chunkedEncoding:false,
         shouldKeepAlive:false,
         useChunkedEncodingByDefault:true,
         sendDate:false,
         _removedConnection:false,
         _removedContLen:false,
         _removedTE:false,
         _contentLength:null,
         _hasBody:true,
         _trailer:'',
         finished:false,
         _headerSent:false,
         socket:null,
         connection:null,
         _header:null,
         _onPendingData:[  
            Function:noopPendingOutput
         ],
         agent:[  
            Agent
         ],
         socketPath:undefined,
         timeout:undefined,
         method:'POST',
         path:'/speech-to-text/api/v1/recognitions?callback_url=<my_callback_url>&events=recognitions.completed_with_results&inactivity_timeout=-1',
         _ended:false,
         res:null,
         aborted:1558070725953,
         timeoutCb:null,
         upgradeOrConnect:false,
         parser:null,
         maxHeadersCount:null,
         _redirectable:[  
            Circular
         ],
         [  
            Symbol(isCorked)
         ]:false,
         [  
            Symbol(outHeadersKey)
         ]:[  
            Object
         ]
      },
      _currentUrl:'https://stream.watsonplatform.net/speech-to-text/api/v1/recognitions?callback_url=<my_callback_url>&events=recognitions.completed_with_results&inactivity_timeout=-1'
   }
}

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Попробуйте добавить maxContentLength: Infinity в качестве опции при создании экземпляра SpeechToText

const speechToText = new SpeechToTextV1({
  username: 'user',
  password: 'pass',
  version: '2019-01-01',
  maxContentLength: Infinity,
});
1 голос
/ 19 мая 2019

ограничение составляет 1 ГБ, убедитесь, что вы используете кодирование передачи Chunked в представлении, что является типичной причиной ошибок при подаче больших файлов. https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding

...