asrclient.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "asrclient.h"
  2. #include <QJsonDocument>
  3. #include <QJsonObject>
  4. #include <QByteArray>
  5. #include <QDebug>
  6. #include <QUrl>
  7. #include <QNetworkAccessManager>
  8. #include <QBuffer>
  9. AsrClient::AsrClient(QObject* parent)
  10. : QObject(parent)
  11. , m_webSocket(nullptr)
  12. , m_isConnected(false)
  13. , m_pingTimer(nullptr)
  14. {
  15. m_webSocket = new QWebSocket(QString(), QWebSocketProtocol::VersionLatest, this);
  16. connect(m_webSocket, &QWebSocket::connected, this, &AsrClient::onConnected);
  17. connect(m_webSocket, &QWebSocket::disconnected, this, &AsrClient::onDisconnected);
  18. connect(m_webSocket, &QWebSocket::textMessageReceived, this, &AsrClient::onTextMessageReceived);
  19. connect(m_webSocket, &QWebSocket::errorOccurred, this, &AsrClient::onError);
  20. m_pingTimer = new QTimer(this);
  21. connect(m_pingTimer, &QTimer::timeout, this, &AsrClient::onPingTimeout);
  22. }
  23. AsrClient::~AsrClient()
  24. {
  25. disconnectFromServer();
  26. }
  27. void AsrClient::connectToServer(const QString& host, quint16 port)
  28. {
  29. if (m_isConnected) {
  30. disconnectFromServer();
  31. return;
  32. }
  33. m_host = host;
  34. m_port = port;
  35. QString url = QString("ws://%1:%2").arg(host).arg(port);
  36. qDebug() << "Connecting to" << url;
  37. m_webSocket->open(QUrl(url));
  38. }
  39. void AsrClient::disconnectFromServer()
  40. {
  41. if (m_pingTimer->isActive()) {
  42. m_pingTimer->stop();
  43. }
  44. if (m_webSocket) {
  45. m_webSocket->close();
  46. }
  47. m_isConnected = false;
  48. }
  49. void AsrClient::sendAudio(const QByteArray& audioData)
  50. {
  51. if (!m_isConnected) {
  52. return;
  53. }
  54. QString base64Data = audioData.toBase64();
  55. QJsonObject message;
  56. message["type"] = "audio";
  57. message["data"] = base64Data;
  58. QJsonDocument doc(message);
  59. m_webSocket->sendTextMessage(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
  60. }
  61. void AsrClient::requestTranscribe()
  62. {
  63. if (!m_isConnected) {
  64. return;
  65. }
  66. QJsonObject message;
  67. message["type"] = "transcribe";
  68. QJsonDocument doc(message);
  69. m_webSocket->sendTextMessage(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
  70. }
  71. void AsrClient::clearBuffer()
  72. {
  73. if (!m_isConnected) {
  74. return;
  75. }
  76. QJsonObject message;
  77. message["type"] = "clear";
  78. QJsonDocument doc(message);
  79. m_webSocket->sendTextMessage(QString::fromUtf8(doc.toJson(QJsonDocument::Compact)));
  80. }
  81. bool AsrClient::isConnected() const
  82. {
  83. return m_isConnected;
  84. }
  85. void AsrClient::onConnected()
  86. {
  87. qDebug() << "WebSocket connected";
  88. m_isConnected = true;
  89. m_pingTimer->start(30000);
  90. emit connected();
  91. }
  92. void AsrClient::onDisconnected()
  93. {
  94. qDebug() << "WebSocket disconnected";
  95. m_isConnected = false;
  96. m_pingTimer->stop();
  97. emit disconnected();
  98. }
  99. void AsrClient::onTextMessageReceived(const QString& message)
  100. {
  101. QJsonDocument doc = QJsonDocument::fromJson(message.toUtf8());
  102. if (!doc.isObject()) {
  103. return;
  104. }
  105. QJsonObject obj = doc.object();
  106. QString type = obj["type"].toString();
  107. if (type == "connected") {
  108. QJsonObject info = obj["model"].toObject();
  109. emit serverInfoReceived(info);
  110. }
  111. else if (type == "transcript") {
  112. QString text = obj["text"].toString();
  113. QString language = obj["language"].toString();
  114. emit transcriptReceived(text, language);
  115. }
  116. else if (type == "error") {
  117. QString errorMsg = obj["message"].toString();
  118. emit connectionError(errorMsg);
  119. }
  120. else if (type == "cleared") {
  121. emit cleared();
  122. }
  123. }
  124. void AsrClient::onError(QAbstractSocket::SocketError error)
  125. {
  126. Q_UNUSED(error)
  127. QString errorString = m_webSocket->errorString();
  128. qWarning() << "WebSocket error:" << errorString;
  129. m_isConnected = false;
  130. emit connectionError(errorString);
  131. }
  132. void AsrClient::onPingTimeout()
  133. {
  134. if (m_isConnected) {
  135. m_webSocket->ping();
  136. }
  137. }