React Native传WAV音频至Golang Lambda调用OpenAI Whisper转写报错
问题排查与解决方案
核心问题分析
当前存在两个关键异常:
- 后端打印
fileReader为空对象,说明请求体未被正确获取或解析 - OpenAI返回格式错误,本质是传递给Whisper的音频文件格式不符合要求,或文件数据已损坏
前端侧排查与修正
1. Android端音频格式不匹配
当前Android配置使用AAC编码器,但WAV格式要求PCM编码。即使文件后缀设为.wav,实际编码格式仍是AAC,会被OpenAI判定为无效格式。
修正配置:
const audioSet: AudioSet = { // Android端改为WAV兼容配置 AudioEncoderAndroid: AudioEncoderAndroidType.PCM_16BIT, OutputFormatAndroid: OutputFormatAndroidType.WAV, AudioSourceAndroid: AudioSourceAndroidType.MIC, // iOS保持原有WAV配置 AVModeIOS: AVModeIOSOption.measurement, AVEncoderAudioQualityKeyIOS: AVEncoderAudioQualityIOSType.high, AVNumberOfChannelsKeyIOS: 2, AVFormatIDKeyIOS: AVEncodingOption.wav, };
2. React Native FormData构造问题
RN中直接传递uri对象存在跨平台兼容风险(比如Android的content:// URI无法被FormData正确解析)。
验证与修正:
- 确认
audioFilePath格式:iOS应为file://开头的本地路径,Android需为真实文件路径(可通过react-native-fs转换content://URI为文件路径) - 可选:通过
react-native-fs读取文件二进制数据后构造FormData:
import RNFS from 'react-native-fs'; const fileData = await RNFS.readFile(audioFilePath, 'base64'); const blob = await fetch(`data:audio/wav;base64,${fileData}`).then(res => res.blob()); formData.append('file', blob, 'audio.wav');
后端侧排查与修正
1. 请求体解析错误
API Gateway配置BinaryMediaTypes后,传递给Lambda的请求体是Base64编码字符串,而非原始二进制数据。使用strings.NewReader处理二进制数据会导致内容损坏或为空。
修正代码:
import ( "encoding/base64" "bytes" ) // 先解码Base64格式的请求体 bodyBytes, err := base64.StdEncoding.DecodeString(request.body) if err != nil { logger.Error("Failed to decode request body", zap.Error(err)) return "", err } // 使用bytes.NewReader处理二进制数据 fileReader := bytes.NewReader(bodyBytes) client := openai.NewClient( option.WithAPIKey(OPEN_AI_KEY), ) response, err := client.Audio.Transcriptions.New(context.Background(), openai.AudioTranscriptionNewParams{ Model: openai.F(openai.AudioModelWhisper1), File: openai.FileParam(fileReader, "audio.wav", "audio/wav"), }) if err != nil { logger.Error("Error transcribing audio", zap.Error(err)) return "", err }
2. 验证数据完整性
- 打印
len(bodyBytes),如果长度为0,说明前端未正确传递文件,或API Gateway的BinaryMediaTypes配置未生效(需确认配置包含multipart/form-data或audio/wav) - 本地测试:使用已知有效的WAV文件,通过后端代码直接调用OpenAI API,验证代码逻辑本身无问题
额外验证步骤
- 前端验证文件格式:读取音频文件前4字节,WAV文件的签名为
RIFF(十六进制52 49 46 46),确认文件实际为WAV格式 - 抓包验证请求:使用Charles或Wireshark抓包,确认FormData中的文件数据已正确传递到后端
内容的提问来源于stack exchange,提问作者PietroPutelli
相关产品推荐
相关产品推荐

