Node.js发送音频文件至koboldcpp报错求助:WAV读取失败
解决koboldcpp接收WAV文件报错的问题
问题根源
你的代码错误地将音频流包裹在对象中传递给axios,导致koboldcpp接收到的不是原始WAV文件内容,而是序列化后的JSON数据,因此Whisper无法解析。
修复方案
方案1:使用FormData(推荐,符合OpenAI兼容接口规范)
koboldcpp的/v1/audio/transcriptions接口遵循OpenAI的API规范,需要通过multipart/form-data格式上传文件。
首先安装依赖:
npm install form-data
修改后的代码:
const FormData = require('form-data'); const fs = require('fs'); const axios = require('axios'); var upload_wave_to_kobolcpp = function(){ return new Promise(async(resolve, reject) => { try { const audioFilePath = './public/audio.wav'; const formData = new FormData(); // 添加音频文件到表单,字段名必须为`file` formData.append('file', fs.createReadStream(audioFilePath), { filename: 'audio.wav', contentType: 'audio/wav' }); // 指定模型(koboldcpp兼容whisper-1参数) formData.append('model', 'whisper-1'); dd.d('audio read success'); const response = await axios.post("http://127.0.0.1:5001/v1/audio/transcriptions", formData, { headers: { // 自动生成正确的请求头,包含boundary ...formData.getHeaders() }, }); dd.d('audio send success'); console.log(response.data); resolve(response.data); } catch (error) { console.error('Error:', error); reject(error); } }); }
方案2:直接传递音频流
如果不想使用FormData,也可以直接将ReadStream作为请求体传递,但需确保Content-Type正确:
var upload_wave_to_kobolcpp = function(){ return new Promise(async(resolve, reject) => { try { const audioFilePath = './public/audio.wav'; const audioStream = fs.createReadStream(audioFilePath); dd.d('audio read success'); const response = await axios.post("http://127.0.0.1:5001/v1/audio/transcriptions", audioStream, { headers: { 'Content-Type': 'audio/wav', }, }); dd.d('audio send success'); console.log(response.data); resolve(response.data); } catch (error) { console.error('Error:', error); reject(error); } }); }
关键说明
- 不要将音频流包裹在对象中传递,否则axios会自动序列化为JSON,导致接口无法识别
- FormData方式更稳妥,适配大多数兼容OpenAI接口的服务,且能自动处理请求头和文件边界
- 无需手动设置
Content-Length,axios会自动计算
内容的提问来源于stack exchange,提问作者Fenix Lam
相关产品推荐
相关产品推荐

