ratchetphp / Pawl Соединение закрыто (1009 -) FRAME :: CLOSE_TOO_BIG = 1009 - PullRequest
0 голосов
/ 10 марта 2019

Я рад, что использую Pawl, и он работает для небольших файлов (например, 350 КБ).

Однако, когда я отправляю больший файл (скажем, 30 МБ) через $fullFileName как показано ниже, я получаю эту ошибку: Connection closed (1009 - ).

\Ratchet\Client\connect($url)->then(function(\Ratchet\Client\WebSocket $conn) use($contentType, $fullFileName) {
    $conn->on('message', function($msg) use ($conn) {
        Log::debug("Received: {$msg}");
    });
    $conn->on('close', function($code = null, $reason = null) {
        Log::debug("Connection closed ({$code} - {$reason})");
    });
    $conn->send(json_encode([
        'content-type' => $contentType,
        'timestamps' => true,
        'speaker_labels' => true,
        'smart_formatting' => true,
        'inactivity_timeout' => 60 * 5,
        'x-watson-learning-opt-out' => true,
        'action' => 'start'
    ]));

    $frame = new \Ratchet\RFC6455\Messaging\Frame(file_get_contents($fullFileName), true, \Ratchet\RFC6455\Messaging\Frame::OP_BINARY);
    $binaryMsg = new \Ratchet\RFC6455\Messaging\Message();
    $binaryMsg->addFrame($frame);
    $conn->send($binaryMsg);
    $conn->send(json_encode([
        'action' => 'stop'
    ]));
}, function ($e) {
    echo "Could not connect: {$e->getMessage()}\n";
});

Когда я ищу использование Frame::CLOSE_TOO_BIG, я вижу, что оно когда-либо использовалось только \Ratchet\RFC6455\Messaging\CloseFrameChecker.

Но я не смог понять, как работает \Ratchet\RFC6455\Messaging\CloseFrameChecker и каковы ограничения на размер файла и как отправлять большие файлы.

Я попытался сначала разбить мой файл на куски, используя str_split изатем добавляю отдельные кадры, но затем я каждый раз бью тайм-ауты сессии, даже для небольших файлов.

Как правильно отправлять файлы большего размера, избегая ошибок Frame::CLOSE_TOO_BIG 1009 и времени ожидания сеанса?

1 Ответ

0 голосов
/ 11 марта 2019

https://cloud.ibm.com/apidocs/speech-to-text и https://cloud.ibm.com/docs/services/speech-to-text?topic=speech-to-text-websockets#WSreturn скажем, 1009 = Соединение закрыто, поскольку размер кадра превысил ограничение 4 МБ.

Поэтому я попытался разбить аудиофайл на отдельные кадры. Мои первые попытки всегда приводили к ошибке "Session timed out.".

https://cloud.ibm.com/docs/services/speech-to-text?topic=speech-to-text-input#timeouts говорит:

Вам не нужно беспокоиться о времени ожидания сеанса после отправки последнего чанка, чтобы указать конец потока. Служба продолжает обрабатывать аудио, пока не вернет окончательные результаты транскрипции. Когда вы транскрибируете длинный аудиопоток, службе может потребоваться более 30 секунд для обработки звука и генерации ответа. Служба не начинает рассчитывать время ожидания сеанса до тех пор, пока не завершит обработку всего полученного аудио. Время обработки сервиса не может привести к превышению времени ожидания сеанса 30 секунд.

Вот код, который, кажется, работает для меня:

/**
 * @param \Ratchet\Client\WebSocket $conn
 * @param string $fileContents
 */
public function sendBinaryMessage($conn, $fileContents) {
    $chunks = str_split($fileContents, 100);
    Log::debug('Split audio into this many frames: ' . count($chunks));
    $final = true;
    foreach ($chunks as $key => $chunk) {
        Log::debug('send chunk key ' . $key);
        $frame = new \Ratchet\RFC6455\Messaging\Frame($chunk, $final, \Ratchet\RFC6455\Messaging\Frame::OP_BINARY);
        $conn->send($frame);
    }
}
...