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.


热爱生活,热爱程序