You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native传WAV音频至Golang Lambda调用OpenAI Whisper转写报错

问题排查与解决方案

核心问题分析

当前存在两个关键异常:

  1. 后端打印fileReader为空对象,说明请求体未被正确获取或解析
  2. 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,验证代码逻辑本身无问题

额外验证步骤

  1. 前端验证文件格式:读取音频文件前4字节,WAV文件的签名为RIFF(十六进制52 49 46 46),确认文件实际为WAV格式
  2. 抓包验证请求:使用Charles或Wireshark抓包,确认FormData中的文件数据已正确传递到后端

内容的提问来源于stack exchange,提问作者PietroPutelli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 11:09:59