Watson 通过 C++ Boost Websockets 的文本到语音转换 - "No such host is known"



我一直无法使用Boost Beast Library

通过C 的Websocket连接Watson的文本对语音服务

我已经在端口80上成功地与echo.websocket.org插入了代码,但它与沃森的URL不起作用。我已经尝试使用协议变体(HTTP(S),WS(S)和未指定(适用于echo.websocket.com)),并且我尝试同时尝试了端口80和443。

我能够在JavaScript中成功运行代码,并且使用Firefox的内置网络工具,我已经验证了它可以通过端口443来工作。使用完全相同的URL和端口号,我可以为我提供以下内容:"没有这样的主机已知。"

这是正确建立连接

的相关JS代码
var completeUrl = "wss://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?access_token=" + accessToken + "&voice=en-US_AllisonVoice";
socket = new WebSocket(completeUrl);

理论上,以下C 代码效果很好,并且在端口80上与echo.websocket.org一起使用,但不使用watson。

#include <boost/beast/core.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <cstdlib>
#include <iostream>
#include <string>
using tcp = boost::asio::ip::tcp;               // from <boost/asio/ip/tcp.hpp>
namespace websocket = boost::beast::websocket;  // from <boost/beast/websocket.hpp>
// Sends a WebSocket message and prints the response
int main(int argc, char** argv)
{
    try
    {
        std::string accessToken = "XXXXX";
        auto const text = "The quick brown fox jumps over the lazy dog.";
        std::string baseURL = "wss://stream.watsonplatform.net/text-to-speech/api/v1/synthesize";
        std::string voiceModel = "en-US_AllisonVoice";
        auto const port = "443";    // port 80 for echo.websocket.org
                                    // port 443 for watson
        std::string const host = baseURL + "?access_token=" + accessToken + "&voice=" + voiceModel;
        //std::string const host = "echo.websocket.org";
        boost::asio::io_context ioc;
        tcp::resolver resolver{ ioc };
        websocket::stream<tcp::socket> ws{ ioc };
        auto const results = resolver.resolve(host, port);      // Problem line - "resolve: No such host is known"
        std::cout << "Host resolved" << std::endl;
        boost::asio::connect(ws.next_layer(), results.begin(), results.end());
        ws.handshake(host, "/");
        std::cout << "Connection established" << std::endl << "------------------------------" << std::endl;
        ws.write(boost::asio::buffer(std::string(text)));
        std::cout << "Client request: " << text << std::endl;
        boost::beast::multi_buffer buffer;
        ws.read(buffer);
        ws.close(websocket::close_code::normal);
        std::cout << "Server response: " << boost::beast::buffers(buffer.data()) << std::endl;
    }
    catch (std::exception const& e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

如果Watson URL是错误的,则不应在JavaScript中起作用。如果C 代码错误,则不应与echo.websocket.org一起使用。所以我不知道问题是什么。

您的代码中的baseURL指定" WSS",这意味着安全的WebSockets(SSL)。但是您的stream被视为普通流。如果要连接到安全的WebSocket服务器,则应将代码基于WebSocket-Client-SSL示例:https://github.com/boostorg/beast/blob/d43d9421a40c0251614bc45ea6dcf921a3dbaf37/example/websampe/websampe/websocket/websocket/client/client/sync-sssl/sync-ssl/websocke_client_client_client_client_sync_sync_ssssssl.cppppppppppppppp>

相关内容

最新更新