1. 背景介绍
最近在开放语音质检系统,数据从客户的OKCC系统中把通话录音推送到我开发的语音质检系统中进行语音质检,但是遇到了一个问题,客户的OKCC服务器每天都会自动重启。因此,我需要给推送脚本设置为开机自启动的服务器。同时语音质检系统所在的那台服务器也设置为开机自启动ASR服务和语音质检系统。
2. 设置推送脚本为自启动服务
在系统的/usr/local/src/push路径中创建了名为push_record.py的文件,我们需要运行这个脚本,在/etc/systemed/system中创建一个名为push.service的文件,并写入下面的内容。
[Unit]
Description=FastAPI Receive App (Uvicorn)
After=network.target mysql.service
[Service]
WorkingDirectory=/usr/local/src/push
Environment="PATH=/opt/miniconda3/envs/push/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONUNBUFFERED=1"
EnvironmentFile=/usr/local/src/push/.env
ExecStart=/opt/miniconda3/envs/push/bin/python /usr/local/src/push/push_record.py
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=push-app
[Install]
WantedBy=multi-user.target
这里需要注意这个服务依赖于数据库MySQL,所以需要在MySQL启动之后启动,也就是上面配置了After=network.target mysql.service。然后还需要注意这里使用的是Miniconda3作为python包管理工具,需要指定自己的这个名为push的环境名所使用的python可执行程序。你可以进入这个push环境后只需which python,这会打印出来,把这个值替换上面配置中的ExecStart=/opt/miniconda3/envs/push/bin/python。同时还用到了环境变量文件.env,可以使用EnvironmentFile来指定。
然后记得执行下面的命令才能生效。
systemctl daemon-reload
最后设置为开机自启动。
systemctl enable push
启动可以使用下面命令。
systemctl start push
3. 设置ASR服务为自启动服务
由于我是基于生产者-消费者模型开发的,所以需要配置两个service,一个名为asr.service,另外一个名为asr-celery.service,其中asr.service启动的是生产者,也就是uvicorn提供的接口,然后asr-celery.service顾名思义启动的是celery,作为消费者,真正进行语音转写的功能。注意这里是本地语音转写,并非调用商用在线API接口,而是直接在本地服务器中跑的语音识别。
先及配置asr.service如下:
[Unit]
Description=FastAPI Receive App (Uvicorn)
After=network.target redis.service mysql.service
[Service]
WorkingDirectory=/usr/local/src/asr
Environment="PATH=/root/miniconda3/envs/asr/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONUNBUFFERED=1"
EnvironmentFile=/usr/local/src/asr/.env
ExecStart=/root/miniconda3/envs/asr/bin/uvicorn top.lukeewin.asr.app:app --host 0.0.0.0 --port 38023
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=receive-app
[Install]
WantedBy=multi-user.target
然后配置asr-celery.service如下:
[Unit]
Description=ASR Celery
After=network.target redis.service mysql.service
[Service]
WorkingDirectory=/usr/local/src/asr
Environment="PATH=/root/miniconda3/envs/asr/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONUNBUFFERED=1"
EnvironmentFile=/usr/local/src/asr/.env
ExecStart=/root/miniconda3/envs/asr/bin/celery -A top.lukeewin.asr.service.celery_service:celery_app worker -l info --pool=prefork --concurrency=6
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=celery
[Install]
WantedBy=multi-user.target
一样的需要执行下面的命令才能生效。
systemctl daemon-reload
设置为开机自启
systemctl enable asr
systemctl enable asr-celery
启动ASR服务
systemctl start asr
systemctl start asr-celery
4. 设置语音质检系统为开机自启服务
创建一个名为qc.service的文件,并写入下面的内容。
[Unit]
Description=FastAPI Receive App (Uvicorn)
After=network.target mysql.service
[Service]
WorkingDirectory=/usr/local/src/receive
Environment="PATH=/root/miniconda3/envs/receive_okcc_data/bin:/usr/local/bin:/usr/bin:/bin"
Environment="PYTHONUNBUFFERED=1"
EnvironmentFile=/usr/local/src/receive/.env
ExecStart=/root/miniconda3/envs/receive_okcc_data/bin/uvicorn main:app --host 0.0.0.0 --port 5000
ExecReload=/bin/kill -HUP $MAINPID
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
SyslogIdentifier=receive-app
[Install]
WantedBy=multi-user.target
设置为开机自启:
systemctl daemon-reload
systemctl enable qc
systemctl start qc
到此,整个语音质检系统就部署并且设置好了开机自启功能。
5. 效果演示
具体效果演示可以看我发布到公众号“编程分享录”中的“OKCC外呼系统语音质检开机自启动设置”的文章,在文章末尾有效果演示截图。
Q.E.D.


