gpt4 book ai didi

websocket - IBM Watson 语音到文本 API 中的 1006 错误代码

转载 作者:行者123 更新时间:2023-12-04 16:13:48 26 4
gpt4 key购买 nike

我正在使用 Ratchet 连接到 IBM Watson websockets,以及 对于较小的文件,它似乎总是可以正常工作(我已经测试了长达 66 分钟的 23 MB mp3 文件),但对于较大的文件(例如 2 小时 56 MB mp3),它总是失败。
这是我的日志:

[2019-03-17 21:43:23] local.DEBUG: \Ratchet\Client\connect bf4e38983775f6e53b392666138b5a3a50e9c9c8  
[2019-03-17 21:43:24] local.DEBUG: startWatsonStream options = {"content-type":"audio\/mpeg","timestamps":true,"speaker_labels":true,"smart_formatting":true,"inactivity_timeout":-1,"interim_results":false,"max_alternatives":1,"word_confidence":false,"action":"start"}
[2019-03-17 21:43:24] local.DEBUG: Split audio into this many frames: 570222
[2019-03-17 21:43:42] local.DEBUG: send action stop
[2019-03-17 21:43:42] local.DEBUG: Received: {
"state": "listening"
}
[2019-03-17 21:43:42] local.DEBUG: Received first 'listening' message.
[2019-03-17 22:56:31] local.DEBUG: Connection closed (1006 - Underlying connection closed)
请注意接收第一个“监听”消息和连接关闭并出现错误之间的 1h13m。
Watson说:“1006 表示连接异常关闭。”
https://www.rfc-editor.org/rfc/rfc6455说:

1006 is a reserved value and MUST NOT be set as a status code in a Close control frame by an endpoint. It is designated for use in applications expecting a status code to indicate that the connection was closed abnormally, e.g., without sending or receiving a Close control frame.


我可以调整代码的哪一部分,以便它可以处理更长的 mp3 文件而不会引发 1006 错误?
\Ratchet\Client\connect($url, [], $headers)->then(function(\Ratchet\Client\WebSocket $conn) use($contentType, $audioFileContents, $callback) {
$conn->on('message', function($msg) use ($conn, $callback) {
$this->handleIncomingWebSocketMessage($msg, $conn, $callback);
});
$conn->on('close', function($code = null, $reason = null) {
Log::debug("Connection closed ({$code} - {$reason})");
});
$this->startWatsonStream($conn, $contentType);
$this->sendBinaryMessage($conn, $audioFileContents);
Log::debug('send action stop');
$conn->send(json_encode(['action' => 'stop']));
}, function (\Exception $e) {
Log::error("Could not connect: {$e->getMessage()} " . $e->getTraceAsString());
});
...
public function handleIncomingWebSocketMessage($msg, $conn, $callback) {
Log::debug("Received: " . str_limit($msg, 100));
$msgArray = json_decode($msg, true);
$state = $msgArray['state'] ?? null;
if ($state == 'listening') {
if ($this->listening) {//then this is the 2nd time listening, which means audio processing has finished and has already been sent by server and received by this client.
Log::debug("FINAL RESPONSE: " . str_limit($this->responseJson, 500));
$conn->close(\Ratchet\RFC6455\Messaging\Frame::CLOSE_NORMAL, 'Finished.');
$callback($this->responseJson);
} else {
$this->listening = true;
Log::debug("Received first 'listening' message.");
}
} else {
$this->responseJson = $msg;
}
}

public function sendBinaryMessage($conn, $fileContents) {
$chunkSizeInBytes = 100; //probably just needs to be <= 4 MB according to Watson's rules
$chunks = str_split($fileContents, $chunkSizeInBytes);
Log::debug('Split audio into this many frames: ' . count($chunks));
$final = true;
foreach ($chunks as $key => $chunk) {
$frame = new \Ratchet\RFC6455\Messaging\Frame($chunk, $final, \Ratchet\RFC6455\Messaging\Frame::OP_BINARY);
$conn->send($frame);
}

}

最佳答案

作为一般建议,基于文件的识别,尤其是文件大于几 MB 时,应该使用 Watson /recognitions 来完成。 API(这里有更多详细信息:https://cloud.ibm.com/apidocs/speech-to-text),这是异步的。您不需要将连接保持打开几个小时,这不是一个好习惯,因为您可能会遇到读取超时,您可能会丢失网络连接等。通过异步执行,您 POST 文件然后连接结束,然后您可以每 X 分钟获取一次状态,或者通过回调获得通知,无论哪种方式对您更有效。

curl -X POST -u "apikey:{apikey}" --header "Content-Type: audio/flac" --data-binary @audio-file.flac "https://stream.watsonplatform.net/speech-to-text/api/v1/recognitions?callback_url=http://{user_callback_path}/job_results&user_token=job25&timestamps=true"

顺便提一句。您的 websockets 客户端是否使用乒乓帧来保持连接活跃?我注意到您没有请求临时结果 ( {"content-type":"audio\/mpeg","timestamps":true,"speaker_labels":true,"smart_formatting":true,"inactivity_timeout":-1,"interim_results":false,"max_alternatives":1,"word_confidence":false,"action":"start"} ),这是保持连接打开的另一种方法,但不太可靠。请检查乒乓球架。

关于websocket - IBM Watson 语音到文本 API 中的 1006 错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55224041/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com