如何在wit.ai中流式传输分片音频做语音识别?排查400错误
哥们,我帮你捋捋wit.ai流式转写时遇到的400错误问题,结合官方API的要求,你可以从这几个方面逐一排查:
排查wit.ai分片流式传输400错误的核心方向
一、先把音频格式的基础问题搞定
wit.ai对音频格式的要求特别严格,哪怕你转成了WAV,也得卡准参数:
- 必须是16kHz采样率、单声道、16位PCM编码:这三个是硬要求,少一个都可能触发400。你可以用
ffmpeg批量转换合规格式:ffmpeg -i 你的原WAV文件.wav -ar 16000 -ac 1 -sample_fmt s16 合规WAV文件.wav - 分片时长要卡准:单段音频不能超10秒,但也别太短(比如至少500毫秒),建议控制在5-9秒之间,避免触发API的边界校验错误。
二、HTTP请求头和传输逻辑别踩坑
你提到的Transfer-encoding是关键,这里有几个容易错的点:
- 必须设置
Transfer-Encoding: chunked,同时绝对不能加Content-Length头,这俩同时存在会直接导致400错误。 - 确认
Authorization头格式:Bearer {你的wit_access_token},检查token有没有过期、有没有开通Speech API的权限(别用错了其他服务的token)。 - 分块传输要严格遵循HTTP规则:每块数据前要先发送十六进制的块长度,再发数据;最后要用
0\r\n\r\n标记传输结束,不能直接断开连接。
三、代码逻辑的细节要抠
如果格式和请求头都没问题,那大概率是流式传输的代码逻辑有问题:
- 先测单块请求:单独拿一片合规的5秒音频,用普通POST请求发送给API,看能不能正常返回结果。如果单块都报错,那问题出在音频或基础请求配置;如果单块正常,再排查流式传输的逻辑。
- 别截断音频帧:分片时别单纯按字节数切割,要按音频帧的大小来分,不然切割到帧中间会导致音频损坏,API识别不了就返回400。
- 不要提前断连接:所有分片数据发送完,再发送结束标记,中途断开连接会让API认为请求不完整,直接返回错误。
四、额外的API限制要留意
- 检查速率限制:短时间内发太多分片可能触发限制,虽然通常是429错误,但极端情况下也可能表现为400,可以放慢传输速度试试。
- 看响应体的错误详情:很多400错误会返回具体描述,比如
invalid audio format或者chunk size too large,别只看状态码,把响应内容打出来看看,能直接定位问题。
给你贴个Python的核心逻辑参考(主要是流式传输的部分):
import requests import os wit_token = "你的wit_access_token" audio_path = "合规的16kHz单声道WAV文件" # 按字节分片,大概对应5-9秒音频(根据16kHz单声道16位PCM的码率计算) chunk_size = 16000 * 2 * 7 headers = { "Authorization": f"Bearer {wit_token}", "Content-Type": "audio/wav", "Transfer-Encoding": "chunked" } with open(audio_path, "rb") as f: with requests.post("https://api.wit.ai/speech", headers=headers, stream=True) as resp: while True: chunk = f.read(chunk_size) if not chunk: break # 发送分块数据 resp.raw.write(f"{len(chunk):x}\r\n".encode() + chunk + b"\r\n") resp.raw.flush() # 发送结束标记 resp.raw.write(b"0\r\n\r\n") resp.raw.flush() print("状态码:", resp.status_code) print("响应内容:", resp.json())
内容的提问来源于stack exchange,提问作者Surjya Narayana Padhi
相关产品推荐
相关产品推荐

