Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录

背景

分析

解决方案


背景

正常情况下,会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时,总会返回非json数据。这是什么问题呢?

分析

期望的完整响应数据如下:

{
  "session": {
    "input_audio_format": "pcm16",
    "instructions": "Role: 1.You are a tarot master who focuses on providing divination and interpretation 2.Your name is Luna 3.Your tarot readings blend intuition and wisdom, uncovering the mysteries of emotion and soul to help you find inner balance. \\nContext: Now the user has drawn 1 tarot cards, which are as follows: the first one is 【The Empress】\\\\n\\\" +, the interpretation is                         \\\"\\\\n\\\" +; the summary is                         \\\"《In the near future, you are likely to find love if you continue to cultivate your inner world and maintain an open heart. Trust in the natural process of life and be mindful of the loving energy you put out into the world, for it will attract a similar energy back to you. Remember to nurture yourself as you would a garden, and the blossoms of love will soon follow.》.\\nPlease start a chat dialogue based on the number of tarot cards the user has drawn, their respective interpretations, summaries, and the user's messages.\\nNote: 1. Please remember the user's historical questions and your answers so that you can provide better help in subsequent conversations. 2.The output characters should be less than 150.",
    "max_response_output_tokens": 4096,
    "modalities": [
      "text",
      "audio"
    ],
    "output_audio_format": "pcm16",
    "temperature": 0.8,
    "tool_choice": "auto",
    "tools": [
      
    ],
    "turn_detection": {
      "prefix_padding_ms": 300,
      "silence_duration_ms": 500,
      "threshold": 0.5,
      "type": "server_vad"
    },
    "voice": "alloy"
  },
  "event_id": "evt_bxsN7DWraWgnUPqxK",
  "type": "session.update"
}

实际收到的数据类似如下:

eart. Trust in the natural process of life and be mindful of the loving energy you put out into the world, for it will attract a similar energy back to you. Remember to nurture yourself as you would a garden, and the blossoms of love will soon follow.》.\\nPlease start a chat dialogue based on the number of tarot cards the user has drawn, their respective interpretations, summaries, and the user's messages.\\nNote: 1. Please remember the user's historical questions and your answers so that you can provide better help in subsequent conversations. 2.The output characters should be less than 150.",
    "max_response_output_tokens": 4096,
    "modalities": [
      "text",
      "audio"
    ],
    "output_audio_format": "pcm16",
    "temperature": 0.8,
    "tool_choice": "auto",
    "tools": [
      
    ],
    "turn_detection": {
      "prefix_padding_ms": 300,
      "silence_duration_ms": 500,
      "threshold": 0.5,
      "type": "server_vad"
    },
    "voice": "alloy"
  },
  "event_id": "evt_bxsN7DWraWgnUPqxK",
  "type": "session.update"
}

明显看起来只收到了部分数据,究其原因是超过了接受缓冲区的65535的最大默认配置,没有进行自定义配置,对于json数据就是设置WebSocket容器的默认最大文本消息缓冲区大小。

解决方案

设置最大文本消息缓冲区大小,具体代码如下:

public static void connect(Channel channel) {
        try {
            WebSocketContainer container = new WsWebSocketContainer();
            // Set the binary message buffer size in bytes
            container.setDefaultMaxBinaryMessageBufferSize(5120000);
            // Set the text message buffer size in bytes
            container.setDefaultMaxTextMessageBufferSize(5120000);
            // Set the session idle timeout in milliseconds
            container.setDefaultMaxSessionIdleTimeout(30 * 60000L);
            StandardWebSocketClient client = new StandardWebSocketClient(container);
            WebSocketHttpHeaders httpHeaders = new WebSocketHttpHeaders();
            httpHeaders.add("Authorization", "Bearer sk-***");
            httpHeaders.add("OpenAI-Beta", "realtime=v1");
            WebSocketSession session = client.doHandshake(new SpringWebSocketClientHandler(), httpHeaders, new URI(URL)).get();
            if (session.isOpen()) {
                log.info("Target Client: WebSocket connection established and bind success!");
                log.info("connect before SESSION_CHANNEL_CONCURRENT_MAP:{}", BindConnectService.SESSION_CHANNEL_CONCURRENT_MAP);
                BindConnectService.safeBindChannelSession(session, channel);
                log.info("connect after SESSION_CHANNEL_CONCURRENT_MAP:{}", BindConnectService.SESSION_CHANNEL_CONCURRENT_MAP);
            } else {
                log.warn("Target Client: WebSocket connection is not open, then add channel failed!");
                channel.close();
            }
        } catch (Exception e) {
            log.error("Target Client: WebSocket connection failed, then add channel failed!", e);
            channel.close();
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FeelTouch Labs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值