diff --git a/freeswitch/Debian11编译安装FreeSWITCH1.10.8和mod_unimrcp-参照mod_unimrcp项目文档.md b/freeswitch/Debian11安装FreeSWITCH1.10.md
similarity index 50%
rename from freeswitch/Debian11编译安装FreeSWITCH1.10.8和mod_unimrcp-参照mod_unimrcp项目文档.md
rename to freeswitch/Debian11安装FreeSWITCH1.10.md
index 05eb03f..d666456 100644
--- a/freeswitch/Debian11编译安装FreeSWITCH1.10.8和mod_unimrcp-参照mod_unimrcp项目文档.md
+++ b/freeswitch/Debian11安装FreeSWITCH1.10.md
@@ -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 \
@@ -32,7 +42,7 @@ sudo apt-get install -y \
liblua5.2-dev \
libopus-dev \
libpq-dev \
- libshout3-dev libmpg123-dev libmp3lame-dev\
+ libshout3-dev libmpg123-dev libmp3lame-dev \
libsndfile1-dev libflac-dev libogg-dev libvorbis-dev
# 安装libks
cd libks
@@ -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`命令参数就可以了。
diff --git a/freeswitch/Debian11安装lua5.2和luarocks.md b/freeswitch/Debian11安装lua5.2和luarocks.md
new file mode 100644
index 0000000..4854666
--- /dev/null
+++ b/freeswitch/Debian11安装lua5.2和luarocks.md
@@ -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
+```
diff --git a/freeswitch/Docker部署阿里云的MRCP服务.md b/freeswitch/Docker部署阿里云的MRCP服务.md
new file mode 100644
index 0000000..da0191a
--- /dev/null
+++ b/freeswitch/Docker部署阿里云的MRCP服务.md
@@ -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)通信,与服务端(阿里云)不需要开放端口,只需要能连接阿里云公有云服务即可。
+
+- 7010(TCP&UDP):SIP端口。
+- 1544、1554(TCP):MRCP协议端口。
+- 10000-20000(UDP):RTP协议端口,用来传输语音流。
+
+##### 并发
+
+SDM单机资源默认支持100路ASR+100路TTS,这个并发指的是SDM与客户端(如FreeSWITCH)的资源处理能力,与公有云的ASR、TTS并发能力无关。
diff --git a/freeswitch/FreeSWITCH对接阿里云MRCP.md b/freeswitch/FreeSWITCH对接阿里云MRCP.md
new file mode 100644
index 0000000..857819d
--- /dev/null
+++ b/freeswitch/FreeSWITCH对接阿里云MRCP.md
@@ -0,0 +1,142 @@
+## FreeSWITCH对接MRCP服务(以阿里云SDM为例)
+
+> wandoubaba / 2023-02-21
+
+在阿里云的的智能语音服务中,除了提供常规的ASR、TTS等能力外,也有完整的MRCP服务(阿里名称:SDM),不但可以对接私有化的智能语音能力,同时还可以对接公有云的ASR和TTS。
+
+### 网络规划
+
+- MRCP服务器
+
+|配置项|配置值|
+|---|---|
+|IP| 192.168.0.10|
+|SIP端口|7010(TCP&UDP)|
+|MRCP端口|1544、1554(TCP)|
+|RTP端口|10000-20000(UDP)|
+
+- FreeSWITCH服务器
+
+|配置项|配置值|
+|---|---|
+|IP|192.168.0.60|
+|SIP端口|5060(TCP&UDP)|
+|RTP端口(与MRCP通信)|40000-50000(UDP)|
+
+### 部署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
+
+
+```
+
+在FreeSWITCH的安装目录下创建`conf/mrcp_profiles/aliyun-mrcpserver.xml`文件:
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+创建或修改`conf/autoload_configs/unimrcp.conf.xml`文件:
+
+```xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+```
+
+在`grammar`目录下创建`alimrcp.gram`文件:
+
+```js
+#JSGF V1.0;
+/** JSGF Grammar for example */
+grammar example;
+public = [];
+```
+
+修改unimrcp配置后需要重启FreeSWITCH服务。
+
+### 通过dialplan测试
+
+在FreeSWITCH安装目录里创建`conf/dialplan/default/mrcp.xml`文件:
+
+```xml
+
+
+
+
+
+
+
+
+
+```
+
+在fs_cli中执行`reloadxml`,然后盯着控制台,用分机呼叫001,接通后说一句话,应该会在控制台看到识别结果,类似:
+
+```xml
+
+
+
+
+ 中午吃什么?
+ 730
+ 2220
+ 511ba061b8a54d7b93e0f5675534febd
+ 5d27104393eb4dbe-1.wav
+
+ 中午吃什么?
+
+
+```
+
+恭喜,到这里,你的FreeSWITCH已经可以“听”和“说”了。
diff --git a/php/php74安装pgsql扩展.md b/php/php74安装pgsql扩展.md
new file mode 100644
index 0000000..1ebde44
--- /dev/null
+++ b/php/php74安装pgsql扩展.md
@@ -0,0 +1,53 @@
+# 为PHP7.4安装pgsql和pdo_pgsql扩展
+
+## 环境与版本
+
+操作系统:CentOS7.9 / Debian11
+
+> 在Debian上操作相关简单,所以本文以Centos7.9为例
+
+软件版本:PHP7.4, postgresql15
+
+## 操作过程
+
+假设基本的LNMP环境都已经安装好了,但是没有安装pgsql扩展。
+
+首先要先安装postgresql才可以安装pgsql扩展,其实不需要安装数据库的服务端,安装devel包就行了。
+
+> postgresql官方下载安装网址:
+
+```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扩展是相同的,这里就不说了。