debian11, lua5.2, sdm

This commit is contained in:
Aaron Chen 2023-02-21 14:04:25 +08:00
parent ce048b4d2d
commit a7c579919d
5 changed files with 405 additions and 43 deletions

View File

@ -1,25 +1,35 @@
# Debian11编译安装FreeSWITCH1.10.8和mod_unimrcp-参照mod_unimrcp项目文档
## Debian编译安装FreeSWITCH
## 安装Debian11系统
> wandoubaba / 2023-01-15
本文以Debian11和FreeSWITCH1.10为例介绍一步一步编译安装FreeSWITCH的方法。
> 至少要安装vim git wget
### 先下载/克隆各种资源
## 下载/克隆各种资源
```bash
cd /usr/src
git clone https://github.com/signalwire/freeswitch
```shell
# 假设所有资源都下载到/opt/目录下
cd /opt
# 下载FreeSWITCH源码
git clone -b v1.10 https://github.com/signalwire/freeswitch freeswitch
# 下载libks源码
git clone https://github.com/signalwire/libks
# 下载sofia-sip源码
git clone https://github.com/freeswitch/sofia-sip
# 下载spandsp源码
git clone https://github.com/freeswitch/spandsp
# 下载signalwire-c源码
git clone https://github.com/signalwire/signalwire-c
git clone https://github.com/unispeech/unimrcp.git
git clone https://github.com/freeswitch/mod_unimrcp.git
wget https://www.unimrcp.org/project/component-view/unimrcp-deps-1-6-0-tar-gz/download -O unimrcp-deps-1.6.0.tar.gz
# 国内连接github很累另外不保证各资源仓库以后更新后对应的操作方法是否会变建议资源下载成功后自己留一份备份
# 后面的操作如果在root账号下就不要再用sudo了
```
> 国内连接github很累另外不保证各资源仓库以后更新后对应的操作方法是否会变建议资源下载成功后自己留一份备份
### 一步一步安装
> 如果后面的操作是在root账号下就不需要再用sudo了
先安装必要的依赖程序。
```shell
# 安装FreeSWITCH需要的依赖
sudo apt-get install -y \
build-essential cmake automake autoconf libtool libtool-bin pkg-config \
@ -58,38 +68,37 @@ cd signalwire-c
PKG_CONFIG_PATH=/usr/lib/pkgconfig cmake . -DCMAKE_INSTALL_PREFIX=/usr
sudo make install
cd ..
# 安装FreeSWITCH
```
可以开始安装FreeSWITCH了
```shell
# 编译安装FreeSWITCH
cd freeswitch
./bootstrap.sh -j
./configure
make -j`nproc`
sudo make install
# 安装英文声音资源(可选)
make cd-sounds-install
make cd-moh-install
make uhd-sounds-install
make uhd-moh-install
make hd-sounds-install
make hd-moh-install
make sounds-install
make moh-install
cd ..
# 安装unimrcp-deps包
tar zxvf unimrcp-deps-1.6.0.tar.gz
cd unimrcp-deps-1.6.0
cd libs/apr
./configure --prefix=/usr/local/apr
make
sudo make install
cd ..
cd apr-util
./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
make
sudo make install
cd ../../..
# 安装unimrcp
cd unimrcp
./bootstrap
./configure --with-sofia-sip=/usr
make
sudo make install
cd ..
# 安装mod_unimrcp
cd mod_unimrcp
export PKG_CONFIG_PATH=/usr/local/freeswitch/lib/pkgconfig:/usr/local/unimrcp/lib/pkgconfig
./bootstrap.sh
./configure
make
sudo make install
```
### 启动FreeSWITCH服务
执行以上步骤后FreeSWITCH已经被安装到/usr/local/freeswitch目录下了。
```shell
cd /usr/local/freeswitch
# 前台启动服务
bin/freeswitch
```
等待一段时间后FreeSWITCH服务就已经成功启动了在当前控制台输入命令`sofia status`可以看到一点配置信息。前台启动方式非常简单,但是一旦执行`...`命令退出控制台后对应的FreeSWITCH服务也就退出了。如果想在后台启动服务在执行`bin/freeswitch`时后面加上`-nc`命令参数就可以了。

View File

@ -0,0 +1,34 @@
## Debian11安装lua5.2和luarocks
> wandoubaba / 2023-01-18
严格来说这个内容并不只针对FreeSWITCH不过打造一个合适的lua的编写和运行环境也是玩转FreeSWITCH的一个前提而且笔者是通过FreeSWITCH才认识lua的所以把搭建lua环境也当作是FreeSWITCH的一个案例看待。
### 安装lua5.2
> 后面的操作过程中如果使用root账号的话就不需要加`sudo`了
```sh
sudo apt-get install -y lua5.2
```
### 安装luarocks
```sh
sudo apt-get install -y unzip
cd /opt
wget https://luarocks.org/releases/luarocks-3.9.2.tar.gz
tar zxpf luarocks-3.9.2.tar.gz
cd luarocks-3.9.2
./configure && make
sudo make install
```
### 验证
```sh
# 查看lua版本号
lua -v
# 查看luarocks版本号
luarocks --version
```

View File

@ -0,0 +1,124 @@
## Docker部署阿里云的MRCP服务版权
> wandoubaba / 2023-02-21
在阿里云的的智能语音服务中除了提供常规的ASR、TTS等能力外也有完整的MRCP服务阿里名称SDM不但可以对接私有化的智能语音能力同时还可以对接公有云的ASR和TTS。
引用阿里云《SDM(MRCP-SERVER)公共镜像使用》文档中的一段话:
> SDM(MRCP-SERVER)目前在公共云上有对应的镜像仓库,用户可以直接拉取公共云镜像到本地,然后部署使用,一定程度上简化了部署和接入的成本。
### 环境依赖
机器需求4C8G
操作系统CentOS7.2及以上其他支持Docker环境的较新版本的Linux发行版
软件环境要求Docker环境
### 安装过程
安装部署主要包括两个过程到阿里云开通公共云语音服务、部署SDM镜像。
#### 开通阿里云智能语音服务
> 下面这些操作都是在阿里云的控制台里完成的。
- 注册阿里云账号,这里省略具体步骤。
- 登录阿里云控制台到“智能语音交互服务”页面开通ASR、TTS相关服务
- 阿里云的语音服务都支持试用版免费使用,只不过并发路数有限,开发测试可以用。
- 到阿里云的“Access Key管理页面”创建并获取一组供SDM使用的具有调用智能语音服务能力的“Access Key ID”和“Access Key Secret”注意妥善保存
- 到阿里云“智能语音交互”控制台->“全部项目”,如果没有项目创建一个项目,项目类型选择“语音识别+语音合成+语音分析“主要是要拿到项目的“AppKey”。
- 注意“AppKey”对应项目的“项目功能配置”中要选择8K模型。
经过以上操作在云端的基础能力就已经配置好了一共得到了3个变量“Access Key ID”、“Access Key Secret”、“AppKey”后面部署SDM时会用到这几个变量。
#### 部署SDM镜像
> 下面的操作是在要部署SDM的服务器上进行的如果是以root登录的话就自行忽略`sudo`假设Linux系统上已经安装好了docker服务。
开始操作之前最好事先在主机上为SDM规划一个目录用于保存配置文件和日志等运行时文件本文假设这个目录是`/data/sdm`,下面的操作都默认在`/data/sdm`目录下进行。
##### 初始化配置
```sh
# 进入主机准备的sdm文件目录
cd /data/sdm
# 拉取镜像
sudo docker pull registry.cn-shanghai.aliyuncs.com/nls-cloud/sdm:latest
# 确认本地已拉取的镜像
sudo docker images | grep sdm
# 初始化本地环境
sudo docker run -d --privileged --net=host --name nls-cloud-sdm -v `pwd`/logs:/home/admin/logs -v `pwd`/data:/home/admin/disk registry.cn-shanghai.aliyuncs.com/nls-cloud/sdm:latest standalone
```
到这里只是用到初始化环境将容器中的SDM目录映射到宿主机上由于相关配置参数还没有修改所以容器最终不会运行起来如果真运行起来了也请用`docker stop`命令将它停了吧),下面需要进行相关配置操作。
##### 配置
首次启动后,容器内的配置文件在宿主机`/data/sdm/data/nls-cloud-sdm/conf`目录下一般来说只需要修改其中的3个配置文件nlstoken.json、service-asr.json、service-tts.json。
- nlstoken.json配置AccessKeyId和AccessKeySecret
```json
{
"AccessKeyId": "前面得到的AccessKeyId",
"AccessKeySecret": "前面得到的AccessKeySecret",
"DefaultToken": ""
}
```
说明对接公有云时DefaultToken的值要是空白。
- service-asr.json主要配置url和AppKey
```json
{
"url": "wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1",
"appkey": "前面得到的项目AppKey",
}
```
- service-tts.json主要配置url和AppKey
```json
{
"url": "wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1",
"appkey": "前面得到的项目AppKey",
}
```
其他asr和tts的配置一般不用修改如果有特殊需求的话就按需配置好了。
##### 启动
```sh
sudo docker start nls-cloud-sdm
# 查看是否启动成功
sudo docker ps
# 查看服务进程是否已拉起
ps -ef | grep alimrcp-server
# 查看端口是否监听
sudo lsof -i:7010
# 查看日志中有没有ERROR信息
cat logs/nls-cloud-sdm/alimrcp-server.log | grep ERROR
# 设置容器自启动
sudo docker update --restart=always nls-cloud-sdm
```
##### 端口
默认情况下SDM使用以下端口与客户端如FreeSWITCH通信与服务端阿里云不需要开放端口只需要能连接阿里云公有云服务即可。
- 7010TCP&UDPSIP端口。
- 1544、1554TCPMRCP协议端口。
- 10000-20000UDPRTP协议端口用来传输语音流。
##### 并发
SDM单机资源默认支持100路ASR+100路TTS这个并发指的是SDM与客户端如FreeSWITCH的资源处理能力与公有云的ASR、TTS并发能力无关。

View File

@ -0,0 +1,142 @@
## FreeSWITCH对接MRCP服务以阿里云SDM为例
> wandoubaba / 2023-02-21
在阿里云的的智能语音服务中除了提供常规的ASR、TTS等能力外也有完整的MRCP服务阿里名称SDM不但可以对接私有化的智能语音能力同时还可以对接公有云的ASR和TTS。
### 网络规划
- MRCP服务器
|配置项|配置值|
|---|---|
|IP| 192.168.0.10|
|SIP端口|7010TCP&UDP|
|MRCP端口|1544、1554TCP|
|RTP端口|10000-20000UDP|
- FreeSWITCH服务器
|配置项|配置值|
|---|---|
|IP|192.168.0.60|
|SIP端口|5060TCP&UDP|
|RTP端口与MRCP通信|40000-50000UDP|
### 部署SDM
目前阿里云并没有开放SDM服务通过阿里云智能语音服务的客户经理可以得以《SDM(MRCP-SERVER)公共镜像使用》文档,按照文档部署,比较容易。
摘抄阿里云《SDM(MRCP-SERVER)公共镜像使用》文档中的一段话:
> SDM(MRCP-SERVER)目前在公共云上有对应的镜像仓库,用户可以直接拉取公共云镜像到本地,然后部署使用,一定程度上简化了部署和接入的成本。
### 安装mod_unimrcp模块
详见《为FreeSWITCH安装mod_unimrcp模块》。
### 配置mod_unimrcp
在FreeSWITCH的安装目录修改`conf/autoload_configs/modules.conf.xml`文件:
```xml
<!-- 添加一行 -->
<load module="mod_unimrcp"/>
```
在FreeSWITCH的安装目录下创建`conf/mrcp_profiles/aliyun-mrcpserver.xml`文件:
```xml
<include>
<profile name="aliyun-mrcpserver" version="2">
<param name="client-ip" value="$${local_ip_v4}"/>
<param name="client-port" value="5060"/>
<param name="server-ip" value="192.168.0.10"/>
<param name="server-port" value="7010"/>
<param name="resource-location" value=""/>
<param name="sip-transport" value="tcp"/>
<param name="sdp-origin" value="Freeswitch"/>
<param name="rtp-ip" value="$${local_ip_v4}"/>
<param name="rtp-port-min" value="40000"/>
<param name="rtp-port-max" value="50000"/>
<param name="speechsynth" value="speechsynthesizer"/>
<param name="speechrecog" value="speechrecognizer"/>
<param name="codecs" value="PCMU PCMA L16/96/8000"/>
</profile>
</include>
```
创建或修改`conf/autoload_configs/unimrcp.conf.xml`文件:
```xml
<configuration name="unimrcp.conf" description="UniMRCP Client">
<settings>
<!-- UniMRCP profile to use for TTS -->
<!-- value对应aliyun-mrcpserver.xml中profile的name -->
<param name="default-tts-profile" value="aliyun-mrcpserver"/>
<!-- UniMRCP profile to use for ASR -->
<!-- value对应aliyun-mrcpserver.xml中profile的name -->
<param name="default-asr-profile" value="aliyun-mrcpserver"/>
<!-- UniMRCP logging level to appear in freeswitch.log. Options are:
EMERGENCY|ALERT|CRITICAL|ERROR|WARNING|NOTICE|INFO|DEBUG -->
<param name="log-level" value="DEBUG"/>
<!-- Enable events for profile creation, open, and close -->
<param name="enable-profile-events" value="false"/>
<param name="max-connection-count" value="100"/>
<param name="offer-new-connection" value="1"/>
<param name="request-timeout" value="3000"/>
</settings>
<profiles>
<X-PRE-PROCESS cmd="include" data="../mrcp_profiles/*.xml"/>
</profiles>
</configuration>
```
在`grammar`目录下创建`alimrcp.gram`文件:
```js
#JSGF V1.0;
/** JSGF Grammar for example */
grammar example;
public <results> = [];
```
修改unimrcp配置后需要重启FreeSWITCH服务。
### 通过dialplan测试
在FreeSWITCH安装目录里创建`conf/dialplan/default/mrcp.xml`文件:
```xml
<include>
<!-- 一个简单实现echo的脚本用于测试lua模块是否好用 -->
<extension name="to_asr">
<condition field="destination_number" expression="^(001)$">
<action application="detect_speech" data="unimrcp:aliyun-mrcpserver alimrcp default"/>
<action application="echo"/>
</condition>
</extension>
</include>
```
在fs_cli中执行`reloadxml`然后盯着控制台用分机呼叫001接通后说一句话应该会在控制台看到识别结果类似
```xml
<?xml version="1.0" encoding="utf-8"?>
<result>
<interpretation grammar="session:default" confidence="1">
<instance>
<result>中午吃什么?</result>
<beginTime>730</beginTime>
<endTime>2220</endTime>
<taskId>511ba061b8a54d7b93e0f5675534febd</taskId>
<waveformUri>5d27104393eb4dbe-1.wav</waveformUri>
</instance>
<input mode="speech">中午吃什么?</input>
</interpretation>
</result>
```
恭喜到这里你的FreeSWITCH已经可以“听”和“说”了。

View File

@ -0,0 +1,53 @@
# 为PHP7.4安装pgsql和pdo_pgsql扩展
## 环境与版本
操作系统CentOS7.9 / Debian11
> 在Debian上操作相关简单所以本文以Centos7.9为例
软件版本PHP7.4, postgresql15
## 操作过程
假设基本的LNMP环境都已经安装好了但是没有安装pgsql扩展。
首先要先安装postgresql才可以安装pgsql扩展其实不需要安装数据库的服务端安装devel包就行了。
> postgresql官方下载安装网址<https://www.postgresql.org/download/>
```sh
# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# Install PostgreSQL:
# 这句和官网的不一样官网让安装postgresql15-server而我们只需要支持扩展所以只安装postgresql15-devel
sudo yum install -y postgresql15-devel
```
以上任务执行完毕后postgresql15的开发包被安装到了`/usr/pgsql-15/`中,后面我们会用到`/usr/pgsql-15/bin`这个路径。
下面需要找到我们PHP7.4的源码目录(没有的话就临时下载一份),进入源码目录`src/ext/pgsql`,执行以下操作:
```sh
phpize
# 注意替换下面的PATH/TO/php-config为真实的php-config路径用find / -name "php-config"可以找到
./configure --with-pgsql=/usr/pgsql-15/bin/ --with-php-config=PATH/TO/php-config
make
make install
```
正常情况下名为pgsql.so的文件将会出现在`PATH/TO/PHP/lib/php/extensions/no-debug-non-zts-20190902/`目录中,记住这个路径。
用php --ini命令找到php.ini和php-cli.ini文件分别编辑这两个文件在最后面添加以下内容
```ini
[pgsql]
extension=PATH/TO/PHP/lib/php/extensions/no-debug-non-zts-20190902/pgsql.so
```
> 再次提醒,别忘了把`PATH/TO/PHP`替换成你的环境中的实际路径。
执行`php -m | grep pgsql`应该可以看到pgsql扩展已经安装好了。
PHP7.4源码目录中的`src/ext/pdo_pgsql`是pdo_pgsql扩展的源码安装过程与pgsql扩展是相同的这里就不说了。