背景
主要是这样的,有一家公司要用到呼叫中心系统,并且安装好了OKCC这个系统,然后需要对通话录音进行分析,是否触发了设置的敏感词,也就是先要转写为文本文字然后才能分析是否命中了敏感词库中设置的敏感词。
首先我是让对方先去对接阿里云的录音文件识别接口的,因为OKCC这个系统支持多种ASR对接,其中包括了阿里云ASR,如果本身这个系统可以调通阿里云的ASR,那么我就可以根据阿里云的ASR接口文档开发自己的ASR接口,但是模型用的是本地模型,也就是不用扣费,可以随意使用。这样对于比较大使用量的公司来说可以节省好大一笔开支。
但是后面对接的时候不是很顺利,不过最终对解决了,成功对接上了自建ASR。写这篇文章的目的是记录一下自己在这个过程中遇到的问题与解决方案。
开发私有ASR接口
这里使用的是fastapi开发的接口,根据阿里云的录音文件识别接口结构开发的,并且使用阿里提供的客户端示例是可以调通的,但是很奇怪的是使用客户的OKCC系统,把domain替换为自己的ip和端口的时候就不行,看ASR服务端日志一直提示“ WARNING: Invalid HTTP request received. ”。
后面的解决方案是添加一层中间层,也就是nginx,并且在nginx配置ssl证书,其实问题就是OKCC这个系统它发送的转写请求是https协议而不是http,因此一直导致“WARNING: Invalid HTTP request received. ”。
还有第二个问题就是接口传参对不上导致无法调用自建ASR接口,但是奇怪的是我直接使用阿里提供的python客户端示例,并且把domain指向自建ASR的IP和端口是可以正常调用的,并且可以获取到转写接口,然而使用OKCC就报错。这里猜测是当时开发这个OKCC系统时阿里云录音识别接口结构不一样。我写的代码中多了Action=SubmitTask和Action=GetTaskResult。这里只需要删除这些就可以了。
额外知识
在这几天忙于搞OKCC对接私有化部署的ASR过程中学会了使用tcpdump来抓包,然后下载到本地使用wireshark来分析包。
可以使用下面的命令在Linux中抓指定显卡的网络报文。
tcpdump -i eth0 -s 0 -A port 8080 -w capture.pcap
其中这个eth0是网卡名,这里并且指定了只抓8080端口的报文。
如果要抓指定域名的报文可以下面这样做。
IPS=$(dig +short filetrans.cn-shenzhen.aliyuncs.com | paste -sd' or host ')
然后执行下面命令。
tcpdump -i ens33 -s 0 \
"(host $IPS) and port 443" \
-w aliyunasr.pcap
如果不需要指定端口,可以把and port 443删除。
这里还学会了一种更简单的方式,直接修改ASR项目的源码,在接口代码上写入下面的代码。
print("=" * 50)
print("URL:", request.url)
print("QUERY:", dict(request.query_params))
print("HEADERS:", dict(request.headers))
print("TASK:", Task)
print("=" * 50)
这样就能知道别人调用我ASR接口到底传递了什么数据过来。

被折叠的 条评论
为什么被折叠?



