在 Flask 应用程序中使用子进程调用 recasepunc.py 时出错:recasepunc 中的错误:无

问题描述 投票:0回答:1

我正在开发一个 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)

我尝试过的:

  1. 我已经确认该命令可以直接在终端中运行:

    echo "hello how are you" | python recasepunc/recasepunc.py predict recasepunc/checkpoint
    

    它返回预期结果:

    "Hello, How are you?"

  2. 我尝试使用

    subprocess.check_output()
    ,如图所示,但输出是
    "Error in recasepunc: None"
    ,它没有提供任何用于故障排除的有用信息。

我的环境:

  • Python 3.10
  • 沃斯克0.3.45
  • 火炬2.2.2
  • 变形金刚4.39.3

有人可以帮助我理解为什么会出现此错误以及如何解决它吗?

python flask subprocess
1个回答
0
投票

无法重现。

音频细节无关紧要,所以我只是分配 直接使用示例文本并在

return
之前设置断点。 它显示了子进程的完美输出:

(Pdb) pp(ret.get_json())
{'processed_text': 'Hello, How are you ?\n',
 'recognized_text': 'hello how are you'}

请注意,您可能希望

.rstrip()
尾随空格。

您正确调用

.check_output()
并进行 utf8 编码/解码。

© www.soinside.com 2019 - 2024. All rights reserved.