WebClient 实现openai 文本转语音报错: DecoderException

2023-12-13 17:54:38

错误信息:?

OpenAI返回数据异常t:{}

io.netty.handler.codec.DecoderException: java.lang.NullPointerException
	at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:471) ~[netty-codec-4.1.53.Final.jar:4.1.53.Final]
	Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 
Error has been observed at the following site(s):
	|_ checkpoint ? Body from POST https://api.openai.com/v1/audio/speech [DefaultClientResponse]
Stack trace:
		at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:471) ~[netty-codec-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) ~[netty-codec-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) [netty-transport-4.1.53.Final.jar:4.1.53.Final]
		at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.

ByteToMessageDecoder.class
361????????throw new DecoderException(var7)

DecoderException?是一个常见的异常,通常在解码数据时出现错误时会抛出。这个异常通常与编码/解码相关的操作有关,例如在处理JSON、XML、Base64或其他格式的数据时。

以下是可能导致抛出?DecoderException?的一些常见情况:

1. 数据格式错误:当你尝试解码的数据格式与期望的格式不匹配时,可能会抛出此异常。例如,如果你期望解码JSON数据,但实际上得到的是XML,那么解码过程可能会失败。
2. 编码/解码参数错误:在使用某些编码/解码方法时,如果提供的参数不正确或不符合预期,可能会抛出此异常。
3. 数据损坏:如果被解码的数据在传输或存储过程中被损坏,那么在解码时可能会抛出此异常。
4. 资源不足:在某些情况下,如果系统资源不足(如内存不足),解码过程可能会失败并抛出此异常。
5. 使用了不支持的字符集:如果你尝试使用一个不支持的字符集来解码数据,可能会抛出此异常。
6. 数据格式不支持:如果你尝试使用不支持的解码器来解码数据,可能会抛出此异常。

我出现的问题是以上的第4点内存不足

 public Flux<byte[]> audioSpeech(String sessionId, String input) {

        if (sessionId == null || input == null) {
            // 处理空值情况,例如抛出异常或返回默认值等
            throw new IllegalArgumentException("Session ID or input cannot be null");
        }

        WebClient wc = WebClient.builder()
                .baseUrl("https://api.openai.com/v1/audio/speech")
                .defaultHeader("Authorization", "Bearer " + openAiConfig.getAuthorization())
                .build();

        // Create a map to represent the JSON body
        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("model", "tts-1");
        requestBody.put("input", input);
        requestBody.put("voice", "alloy");
        requestBody.put("response_format", "mp3");
        requestBody.put("speed", "1.0");

        return wc.post()
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(requestBody))
                .retrieve()
                .bodyToFlux(byte[].class)
                .onErrorResume(WebClientResponseException.class, ex -> {
            HttpStatus status = ex.getStatusCode();
            String res = ex.getResponseBodyAsString();
            log.error("OpenAI API error: {} {}", status, res);
            return Mono.error(new RuntimeException(res));
        });
    }

文章来源:https://blog.csdn.net/weixin_43652507/article/details/134975691
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。