from vosk import Model, KaldiRecognizer from flask import Flask, request, jsonify import json import wave app = Flask(__name__) @app.route('/transcribeDemo02', methods=['POST']) #接口路径 def offline_asr(): audio_path = request.json['recording_address'] model = Model("model/zh-cn") # 中文模型路径 wf = wave.open(audio_path, "rb") recognizer = KaldiRecognizer(model, wf.getframerate()) result = [] while True: data = wf.readframes(4000) if len(data) == 0: break if recognizer.AcceptWaveform(data): res = json.loads(recognizer.Result()) result.append(res.get("text", "")) final = json.loads(recognizer.FinalResult()) result.append(final.get("text", "")) return "".join(result) if __name__ == '__main__': app.run( host='192.168.2.5', port=1000, debug=True) 录音文件地址转wav
时间: 2025-07-14 16:36:26 浏览: 9
<think>嗯,用户之前已经问过关于Python调用免费录音转文字的方法,现在他们给了一段具体的代码,看起来是使用Vosk库和Flask搭建的一个API服务,然后询问关于这个代码的问题,特别是录音文件地址转WAV的部分。我需要先仔细看看用户提供的代码,找出潜在的问题或需要改进的地方。
首先,用户提供的代码中有一个Flask应用,路由是/transcribeDemo02,处理POST请求。函数offline_asr从请求的JSON中获取recording_address作为音频路径,然后使用Vosk进行识别。不过,用户提到“录音文件地址转wav”,可能是指他们的输入文件不是WAV格式,需要转换。之前的回答里提到过用pydub转换格式,但这段代码里没有处理,直接用了wave.open,这可能有问题,因为wave只能处理WAV文件。如果用户上传的是其他格式如MP3,这段代码就会报错。
接下来,代码中模型路径是硬编码的"model/zh-cn",这在部署时可能会有问题,特别是如果应用运行在不同环境中,路径可能需要调整,或者模型文件不存在,导致错误。需要提醒用户确保模型路径正确,并且已经下载了中文模型。
然后,代码里用了wave.open来读取音频文件,但可能没有检查文件是否存在或是否可读。如果音频路径错误或文件损坏,这里会抛出异常,而Flask应用如果没有异常处理,会返回500错误。所以需要建议添加异常处理,比如try-except块,来捕获可能的错误,并返回友好的错误信息。
另外,代码返回的是拼接后的字符串,但作为API,最好返回结构化的数据,比如JSON格式,包含状态码、识别结果和可能的错误信息。用户现在直接返回字符串,可能不利于客户端解析,特别是出现错误时,客户端无法区分成功还是失败。
关于录音文件转WAV的部分,用户可能在代码中没有实现格式转换,所以需要补充这部分。例如,在接收到非WAV文件时,使用pydub进行转换,然后再处理。或者提醒用户必须确保上传的文件是WAV格式,或者服务端自动转换。
还有,用户运行Flask应用时使用了debug=True,这在生产环境中是不安全的,应该提醒他们在部署时关闭debug模式。此外,指定的host是192.168.2.5,这个内网IP可能只在本地网络可用,如果需要对外服务,可能需要配置为0.0.0.0,但要注意安全风险。
最后,检查代码的完整性,比如是否缺少必要的导入,比如pydub是否已经安装,模型是否正确下载。用户可能遇到的问题包括文件格式不支持、模型路径错误、缺少依赖库等,需要逐一指出并提供解决方案。
总结下来,用户的需求是搭建一个接收录音文件地址并转写的API服务,但当前的代码存在格式转换缺失、异常处理不足、返回格式不友好等问题。需要针对这些问题给出改进建议,并确保用户了解如何正确配置和使用这个服务。</think>以下是针对您提供的代码的详细分析和改进建议,重点解决音频格式转换和接口优化问题:
---
### **代码核心问题分析**
1. **格式兼容性缺陷**
- `wave`模块仅支持WAV格式
- 未处理MP3等常见格式的自动转换
2. **安全隐患**
- 直接使用客户端传入的路径(可能引发路径遍历攻击)
- 调试模式暴露(`debug=True`)
3. **健壮性不足**
- 缺少异常处理机制
- 未验证输入参数有效性
---
### **改进版代码**
```python
from vosk import Model, KaldiRecognizer
from flask import Flask, request, jsonify
from pydub import AudioSegment
import tempfile
import os
import wave
import json
app = Flask(__name__)
# 初始化模型(提前加载避免重复创建)
MODEL_PATH = "model/zh-cn"
if not os.path.exists(MODEL_PATH):
raise RuntimeError("中文模型未找到,请从 https://alphacephei.com/vosk/models 下载并解压")
asr_model = Model(MODEL_PATH)
def convert_to_wav(input_path):
"""自动转换为符合要求的WAV格式"""
try:
audio = AudioSegment.from_file(input_path)
audio = audio.set_frame_rate(16000).set_channels(1)
temp_path = os.path.join(tempfile.gettempdir(), "temp.wav")
audio.export(temp_path, format="wav", parameters=["-acodec", "pcm_s16le"])
return temp_path
except Exception as e:
raise RuntimeError(f"格式转换失败: {str(e)}")
@app.route('/transcribeDemo02', methods=['POST'])
def offline_asr():
try:
# 参数验证
if not request.json or 'recording_address' not in request.json:
return jsonify({"error": "缺少录音文件路径参数"}), 400
input_path = request.json['recording_address']
# 安全校验(演示用简单校验)
if not os.path.exists(input_path):
return jsonify({"error": "文件不存在"}), 404
# 格式转换处理
wav_path = convert_to_wav(input_path)
# 语音识别核心逻辑
with wave.open(wav_path, "rb") as wf:
if wf.getnchannels() != 1 or wf.getsampwidth() != 2:
return jsonify({"error": "仅支持16-bit单声道WAV格式"}), 400
recognizer = KaldiRecognizer(asr_model, wf.getframerate())
result = []
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if recognizer.AcceptWaveform(data):
res = json.loads(recognizer.Result())
result.append(res.get("text", ""))
final = json.loads(recognizer.FinalResult())
result.append(final.get("text", ""))
# 清理临时文件
os.remove(wav_path)
return jsonify({
"status": "success",
"result": "".join(result)
})
except Exception as e:
return jsonify({
"status": "error",
"message": str(e)
}), 500
if __name__ == '__main__':
app.run(
host='0.0.0.0', # 改为0.0.0.0可外网访问
port=1000,
debug=False # 生产环境必须关闭调试模式
)
```
---
### **关键改进说明**
1. **格式自动转换**
- 使用`pydub`实现自动转码
- 强制统一为16000Hz采样率、单声道、16-bit PCM格式
- 临时文件自动清理机制
2. **安全增强**
```python
# 示例路径安全检查(可根据需求扩展)
if not input_path.startswith('/allowed/path/'):
return jsonify({"error": "非法文件路径"}), 403
```
3. **性能优化**
- 模型预加载(避免每次请求重复加载)
- 使用临时目录处理文件
4. **音频规范校验**
```python
if wf.getnchannels() != 1 or wf.getsampwidth() != 2:
return jsonify({"error": "仅支持16-bit单声道WAV格式"}), 400
```
---
### **部署建议**
1. **模型配置**
```bash
# 中文模型下载命令示例
wget https://alphacephei.com/vosk/models/vosk-model-cn-0.22.zip
unzip vosk-model-cn-0.22.zip -d model/
```
2. **运行要求**
```bash
# 依赖安装
pip install vosk flask pydub
```
3. **生产环境建议**
- 使用Gunicorn部署:
```bash
gunicorn -w 4 -b 0.0.0.0:1000 your_app:app
```
- 添加API速率限制
- 启用HTTPS加密
---
### **接口测试方法**
```bash
# 使用curl测试(示例)
curl -X POST http://localhost:1000/transcribeDemo02 \
-H "Content-Type: application/json" \
-d '{"recording_address": "/path/to/your/audio.mp3"}'
```
---
### **典型错误响应**
| HTTP状态码 | 错误类型 | 示例响应 |
|-----------|-------------------------|---------------------------------------|
| 400 | 参数缺失/格式错误 | `{"error": "缺少录音文件路径参数"}` |
| 404 | 文件不存在 | `{"error": "文件不存在"}` |
| 500 | 服务器内部错误 | `{"error": "格式转换失败: ..."}` |
建议前端根据这些错误码进行相应的用户提示处理。
阅读全文
相关推荐
















