我正在开发一个 Flask 应用程序,它使用 Vosk 语音识别库将音频转录为文本,然后将该文本发送到
recasepunc.py
脚本以进行标点符号恢复。我遇到的问题是出现以下错误:
Error in recasepunc: None
当我尝试通过子进程将识别的文本从 Vosk 传递到
recasepunc.py
脚本时,会发生错误。我尝试运行的命令是:
processed_text = subprocess.check_output(
'python recasepunc/recasepunc.py predict recasepunc/checkpoint', shell=True, text=True, input=recognized_text)
其中
recognized_text
是Vosk识别的结果,如"hello how are you"
。
以下是应用程序代码的完整上下文:
from vosk import Model, KaldiRecognizer, SetLogLevel
from pydub import AudioSegment
from flask import Flask, request, jsonify
import subprocess
import json
app = Flask(__name__)
@app.route('/', methods=['POST'])
def process_audio():
file = request.files.get('111')
if file:
try:
song = AudioSegment.from_file(file)
SetLogLevel(0)
FRAME_RATE = 16000
CHANNELS = 1
model = Model("model")
rec = KaldiRecognizer(model, FRAME_RATE)
rec.SetWords(True)
wavv = song.set_channels(CHANNELS)
wavv = song.set_frame_rate(FRAME_RATE)
rec.AcceptWaveform(wavv.raw_data)
result = rec.Result()
recognized_text = json.loads(result)["text"]
try:
processed_text = subprocess.check_output(
'python recasepunc/recasepunc.py predict recasepunc/checkpoint', shell=True, text=True, input=recognized_text)
except subprocess.CalledProcessError as e:
processed_text = f"Error in recasepunc: {e.stderr}"
return jsonify({
"recognized_text": recognized_text,
"processed_text": processed_text
})
except Exception as e:
return jsonify({"error": str(e)}), 500
else:
return jsonify({"error": "No audio file provided"}), 400
if __name__ == "__main__":
app.debug = True
app.run(host="0.0.0.0", port=5000)
我已经确认该命令可以直接在终端中运行:
echo "hello how are you" | python recasepunc/recasepunc.py predict recasepunc/checkpoint
它返回预期结果:
"Hello, How are you?"
。
我尝试使用
subprocess.check_output()
,如图所示,但输出是"Error in recasepunc: None"
,它没有提供任何用于故障排除的有用信息。
有人可以帮助我理解为什么会出现此错误以及如何解决它吗?
无法重现。
音频细节无关紧要,所以我只是分配 直接使用示例文本并在
return
之前设置断点。
它显示了子进程的完美输出:
(Pdb) pp(ret.get_json())
{'processed_text': 'Hello, How are you ?\n',
'recognized_text': 'hello how are you'}
请注意,您可能希望
.rstrip()
尾随空格。
您正确调用
.check_output()
并进行 utf8 编码/解码。