记录一次机器学习模型部署
简介:做了一个语音识别心脏病的机器学习模型,想要实现前后端简单的部署
用到的技术栈:Python、Flask、uni-app
前端
使用uni-app做一个小程序。需要具有语音采集、录音回放、录音上传等功能。使用uni.getRecorderManager()
实现对录音全局的控制。
这里给出实现上传录音并接收请求结果的主要代码
upload() {
console.log(this.voicePath)
uni.uploadFile({
url: 'http://202.115.52.33:9500/process_data',
filePath: this.voicePath,
name: 'file',
fileType: "audio", //文件类型
success: (res) => {
console.log('success',res.data)
uni.showToast({
title: '上传成功',
icon: 'success',
});
if(res.data*1 < 0.35){
uni.showModal({
title: '检测结果',
content: '您患心脏病概率为:'+ Number(res.data*100).toFixed(2) + '%'+',心脏健康请继续保持',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}else{
uni.showModal({
title: '检测结果',
content: '您患心脏病概率为:'+ Number(res.data*100).toFixed(2) + '%'+',请及时到医院检查',
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
}
},
fail: (err) => {
console.log((err))
uni.showToast({
title: '上传失败',
icon: 'none',
});
},
});
}
这里有个坑需要注意,微信开发者工具模拟器录音上传到服务器,服务器无法正常使用录音(一直以为是前端上传语音的问题)。开发者工具录音文件为silk格式,说是silk其实是base64加密后的webm格式,不是普通的wav格式(貌似只能用chrome浏览器打开)。可以参考这篇文章微信小程序-录音文件无法播放问题 - 知乎 (zhihu.com),真机调试则不会出现这个问题。
后端
采用Flask来进行机器学习或者深度学习模型的部署。
# app.py
from flask import Flask, request
from predict import predict
app = Flask(__name__)
@app.route('/process_data', methods=['POST'])
def process_data():
# 从前端接收音频文件
fileStorage = request.files['file'] # 视频文件
buffer_data = fileStorage.read()
filename = request.files['file'].filename
temp_path = 'upload/'+filename
with open(temp_path, 'wb+') as f:
f.write(buffer_data) # 二进制转为音频文件
# 模型推理
predict_outcome = round(predict(temp_path), 4)
# 返回结果
return str(predict_outcome)
if __name__ == "__main__":
app.run()
部署
使用宝塔面板实现Flask项目快速部署。
- 在宝塔面板中安装Python项目管理器软件
- 上传Flask项目到服务器相应目录
- 在Python项目管理选择Flask框架,安装Flask项目中需要的第三方包
这里有个需要注意的问题,我修改了第三方包的源码,下载的第三方包存放目录:上传项目文件夹/一串数字_venv/lib/python3.7/site-packages
,在这里修改源码重启Python服务才能生效。 - Python项目管理器配置参考
bind = '0.0.0.0:5000'
user = 'scu611'
workers = 1
threads = 2
backlog = 512
daemon = True
chdir = '/www/server/phpmyadmin/heartbroken'
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'
loglevel = 'info'
worker_class = 'geventwebsocket.gunicorn.workers.GeventWebSocketWorker'
errorlog = chdir + '/logs/error.log'
accesslog = chdir + '/logs/access.log'
pidfile = chdir + '/logs/heartbroken.pid'
作者:用户7850680667062
来源:juejin.cn/post/7218098727608549432
来源:juejin.cn/post/7218098727608549432