Nodejs调用OpenAI语音转写接口结果异常求助
解决Node.js调用OpenAI语音转写接口转写结果异常的问题
可能的问题及解决方案
1. 文件流读取不完整
你当前用data.file.read()同步读取文件内容,但Fastify Multipart返回的file是可读流,同步read()可能无法获取完整的音频数据(尤其是大文件)。直接传递流对象给FormData即可:
const formData = new FormData() formData.append('model', this._config.audioModel) formData.append('language', input.language) // 直接传递file流,而非read()的结果,同时补充MIME类型帮助OpenAI识别格式 formData.append('file', data.file, { filename: data.filename, contentType: data.mimetype })
2. Axios请求限制导致数据截断
音频文件可能超出Axios默认的请求体大小限制,导致数据被截断。在请求配置中取消大小限制:
const result = await axios.post('https://api.openai.com/v1/audio/transcriptions', formData, { headers: { Authorization: `Bearer ${this._config.apiKey}`, ...formData.getHeaders() }, maxContentLength: Infinity, maxBodyLength: Infinity // 取消请求体大小限制 })
3. 错误日志不详细,无法定位问题
当前错误日志仅打印error对象,无法获取OpenAI返回的具体错误信息。修改catch块打印详细错误:
catch (error) { console.error('OpenAI转写错误:', { status: error.response?.status, message: error.response?.data?.error?.message, details: error.response?.data?.error?.details }) }
4. Fastify接收文件的配置问题
确保Fastify正确配置了multipart解析,没有限制文件大小或错误截断文件。在Nestjs的启动文件中添加:
// main.ts import { NestFactory } from '@nestjs/core'; import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'; import fastifyMultipart from '@fastify/multipart'; async function bootstrap() { const app = await NestFactory.create<NestFastifyApplication>( AppModule, new FastifyAdapter() ); await app.register(fastifyMultipart, { limits: { fileSize: 100 * 1024 * 1024 // 设置合适的文件大小限制,比如100MB } }); await app.listen(3000); } bootstrap();
完整的正确实现示例
// Nestjs Service中的转写方法 async transcribeAudio(input: { language: string }, data: { file: NodeJS.ReadableStream; filename: string; mimetype: string }) { const formData = new FormData(); formData.append('model', this._config.audioModel); formData.append('language', input.language); formData.append('file', data.file, { filename: data.filename, contentType: data.mimetype }); try { const result = await axios.post('https://api.openai.com/v1/audio/transcriptions', formData, { headers: { Authorization: `Bearer ${this._config.apiKey}`, ...formData.getHeaders() }, maxContentLength: Infinity, maxBodyLength: Infinity }); return result.data; } catch (error) { console.error('转写请求失败:', { status: error.response?.status, message: error.response?.data?.error?.message, details: error.response?.data?.error?.details }); throw new Error('音频转写失败'); } }
内容的提问来源于stack exchange,提问作者Thai Nguyen
相关产品推荐
相关产品推荐

