Node.js如何将multer上传的wav音频传递给Python脚本实现语音识别
实现方案
你可以直接将multer存储的音频文件路径传递给Python脚本,配合你现有代码的stdin读取逻辑即可完成调用,具体实现如下:
Node.js 端核心代码
你需要在上传路由中通过child_process.spawn启动Python子进程,将文件路径序列化后传入stdin:
const { spawn } = require('child_process'); const path = require('path'); // 其他express、multer的配置保持你现有逻辑不变 app.post('/upload', upload.single('file'), (req, res) => { // 转换为绝对路径,避免Python读取相对路径失败 const audioFilePath = path.resolve(__dirname, req.file.path); // 启动Python子进程,注意本地Python命令如果是python3需对应修改 const pyProcess = spawn('python', ['你的ASR脚本文件路径.py']); // 向Python stdin写入序列化后的路径 pyProcess.stdin.write(JSON.stringify(audioFilePath)); pyProcess.stdin.end(); let asrResult = ''; let errLog = ''; // 接收Python输出的识别结果 pyProcess.stdout.on('data', data => { asrResult += data.toString(); }); // 接收Python错误输出 pyProcess.stderr.on('data', data => { errLog += data.toString(); }); // 子进程退出后返回结果给前端 pyProcess.on('close', code => { if (code !== 0) { return res.status(500).json({ success: false, error: errLog || '识别进程异常' }); } res.json({ success: true, result: asrResult.trim() }); }); });
Python 脚本调整
你现有脚本缺少执行入口,需要在末尾添加启动逻辑,修改后完整代码如下:
import speech_recognition as sr import sys, json def read_in(): lines = sys.stdin.readlines() return json.loads(lines[0]) def main(): audio_path = read_in() r = sr.Recognizer() with sr.AudioFile(audio_path) as source: audio_text = r.listen(source) try: text = r.recognize_google(audio_text) print(text) except Exception as e: print(f'Error Occurred: {str(e)}') # 新增执行入口 if __name__ == "__main__": main()
注意事项
- 确保运行环境已安装Python依赖:执行
pip install SpeechRecognition pyaudio即可,Windows环境如果安装pyaudio失败可下载对应版本的whl包本地安装 - 识别完成后如果不需要保留音频文件,可新增逻辑删除
public目录下的临时文件,避免占用磁盘空间 - 如果是Linux/macOS环境,Python命令默认是
python3,需把spawn的第一个参数对应改为python3
内容的提问来源于stack exchange,提问作者Shivam Raina
相关产品推荐
相关产品推荐

