愚者Pro 2025-07-01 16:25 采纳率: 0%
浏览 25

coze双向流式对话事件的增量语音处理

this.wsManager.sendAudioChunk(item.base64EncodedAudioDelta)发送完成音频后,为什么智能体解析音频的content是空

我的音频发送代码

// 上传音频到智能体
const base64Data = e.target.result.split(',')[1]; // 去掉 data:audio/mpeg;base64, 前缀
const binaryString = atob(base64Data); // Base64 转二进制字符串
console.log("转换后的 binaryString:",binaryString);
const arrayBuffer = new ArrayBuffer(binaryString.length);
console.log("转换后的 arrayBuffer:",arrayBuffer);
const uint8Array = new Uint8Array(arrayBuffer);
for (let i = 0; i < binaryString.length; i++) {
    uint8Array[i] = binaryString.charCodeAt(i);
}
const chunksData = this.chunkAndEncodeBase64(arrayBuffer)
console.log("转换后的 chunksData:",chunksData);
// 流式提交音频
for (let index = 0; index < chunksData.length; index++) {
    let item = chunksData[index];
    this.wsManager.sendAudioChunk(item.base64EncodedAudioDelta)
}
// 提交音频完成
this.wsManager.sendAudioComplete()
// 转base64EncodedAudioDelta
chunkAndEncodeBase64(arrayBuffer,CHUNK_SIZE=1024) {
    const chunks = [];
    let offset = 0;
    while (offset < arrayBuffer.byteLength) {
        const chunk = arrayBuffer.slice(offset, offset + this.CHUNK_SIZE);
        const base64 = this.arrayBufferToBase64(chunk);
        // console.log('base64--------------------',base64);
        chunks.push({
            base64EncodedAudioDelta: base64,
            index: offset / this.CHUNK_SIZE, // 分片序号(可选)
            isLast: offset + this.CHUNK_SIZE >= arrayBuffer.byteLength // 是否最后一片
        });
        offset += this.CHUNK_SIZE;
    }
    return chunks;
}

WebSocket.js配置

    // 初始化连接
    connect() {
        // 创建新连接(携带Token)
        this.socketTask = uni.connectSocket({
            url: this.url,
            header: {
                Authorization: `Bearer ${this.token}`
            }, // 关键:Header传Token
            success: () => console.log("WebSocket连接创建中..."),
            fail: err => console.error("连接创建失败:", err)
        });

        this.socketTask.onMessage(res => {
            this.handleMessage(res.data); // 消息处理
        });
    }
    // 发送音频配置(可选步骤)
    sendAudioConfig() {
        const config = {
            "id": "event_id",
            "event_type": "chat.update",
            "data": {
                "input_audio": { // 输入音频格式
                    "format": "pcm", // 输入音频格式,支持 pcm/wav/ogg。默认 wav
                    "codec": "pcm", // 输入音频编码。 pcm/opus。默认 pcm
                    "sample_rate": 24000, // 采样率
                    "channel": 1, // 通道数
                    "bit_depth": 16 // 位深
                },
                "output_audio": { // 输出音频格式
                    "codec": "pcm",
                    "pcm_config": {
                        "sample_rate": 16000, // 默认  24000
                        "frame_size_ms": 50,
                        "limit_config": {
                            "period": 1,
                            "max_frame_num": 22
                        }
                    },
                    "speech_rate": 0, // 回复的语速,取值范围 [-50, 100],默认为 0,-50 表示 0.5 倍速,100 表示 2倍速
                    "voice_id": "7426720361733046281"
                }
            }
        }
        this.send(config);
    }
    // 发送音频分块数据
    sendAudioChunk(base64Data) {
        const event = {
            id: this.generateUUID(),
            event_type: "input_audio_buffer.append",
            data: {
                delta: base64Data
            }
        };
        // console.log('event=--------', base64Data);
        this.send(event);
    }
    // 标记音频输入完成
    sendAudioComplete() {
        const event = {
            id: this.generateUUID(),
            event_type: "input_audio_buffer.complete"
        };
        this.send(JSON.stringify(event));
    }
    // 发送消息
    send(data) {
        if (!this.isConnected) {
            console.warn("连接未就绪,消息丢弃");
            return;
        }
        const payload = typeof data === 'string' ? data : JSON.stringify(data);
        this.socketTask.send({
            data: payload
        });
    }
      // 接收消息
    handleMessage(data) {
        try {
            const msg = JSON.parse(data);
            console.log('获取消息msg', msg);
            // 处理服务端返回的各种事件
            switch (msg.event_type) {
                ...
            }
        } catch (e) {
            console.error("消息处理失败", e);
        }
    }

chunksData打印为

img

智能体返回的消息

img

  • 写回答

6条回答 默认 最新

  • 阿里嘎多学长 2025-07-01 16:25
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    解答

    你遇到的问题是,发送完成音频后,智能体解析音频的content是空。这个问题可能是由于音频数据的处理方式或发送方式导致的。

    首先,需要检查音频数据是否正确地被发送出去。可以通过检查网络请求是否成功、音频数据是否正确地被base64编码等方式来验证。

    其次,需要检查智能体是否正确地解析音频数据。可以通过检查智能体的音频处理逻辑、是否正确地解析音频头信息等方式来验证。

    如果以上步骤都没有问题,那么可能是由于音频数据的处理方式或发送方式导致的。可以尝试以下解决方案:

    1. 检查音频数据是否被正确地base64编码。如果不是,可以尝试使用其他base64编码库或方式来编码音频数据。
    2. 检查智能体是否正确地解析音频数据。如果不是,可以尝试使用其他音频解析库或方式来解析音频数据。
    3. 检查音频数据是否被正确地发送出去。如果不是,可以尝试使用其他网络请求库或方式来发送音频数据。

    以下是一个简单的示例代码,用于发送音频数据:

    // 发送音频数据
    this.wsManager.sendAudioChunk(item.base64EncodedAudioDelta);
    
    // 解析音频数据
    const audioData = atob(item.base64EncodedAudioDelta);
    const audioBuffer = new AudioBuffer(audioData);
    

    这个示例代码使用了Web Audio API来解析音频数据。如果你使用的是其他音频处理库,可以根据库的文档来实现音频数据的解析。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月1日