GitHub no se registra todos los días. Si tiene alguna pregunta, comuníquese con [email protected] y responda en su tiempo libre. ¡Gracias!
Este es mi primer proyecto GitHub. Me gustaría agradecer al sitio web de Cotin "construir un sistema de servicio al cliente inteligente simple" (i), (ii) y (ii) por la ayuda del proceso de construcción. Antes de leer este tutorial, primero puede leer estos tres artículos. Este tutorial ajusta el orden de construcción en función de esto y ofrece más detalles de operación, manejo de errores y otras descripciones de construcción.
Use FreesWitch para aceptar llamadas de teléfono móvil del usuario, use el complemento IFLYTEK Open Platform (XFYUN) para integrar el complemento IFLYTEK Open Platform (XFYUN) para realizar el reconocimiento de voz (ASR) y llamar a la síntesis de voz (TTS) basado en el Logic de negocios personalizado para construir un Centro de llamadas de voz de extremo simple.

Freeswitch en este ejemplo se compila e instala en la versión del sistema MacOS High Sierra 10.13.4. No está instalado utilizando paquetes de software. Para los pasos de instalación específicos, consulte la Introducción oficial de instalación del sitio web. Otras plataformas como Linux (Ubuntu, CentOS) deben instalarse correctamente.
Los siguientes son los pasos para la compilación e instalación del código fuente:
1. Descargue el código fuente de Freeswitch:
cd /usr/local/src
git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch2. Instale la biblioteca de dependencia
brew install autoconf
brew install automake
brew install libtool
brew install pkg-config
brew install speexdsp
brew install speex
brew install libldns-dev
brew install OpenSSL
brew install pcre
brew install pkgconfig sqlite3
brew install lua
brew install opus
brew install libsndfileNota: Para otras plataformas del sistema, confirme el contenido de la biblioteca de dependencia por usted mismo. Posibles resultados de búsqueda: dependencias de instalación de Ubuntu/Centos Freeswitch. Bajo Ubuntu: Libtool no encontrado.
3. Compilar e instalar
cd freeswitch/
# 先执行 bootstrap.sh,生成configure文件
./bootstrap.sh
./configure --prefix=/usr/local/freeswitch
make
make install
make cd-sounds-install
make cd-moh-install4. Corre
cd /usr/local/freeswitch/bin
./freeswitchPuede iniciar la aplicación.
Nota: Problemas que pueden ocurrir durante la instalación. Errores en Configurar.
Freeswitch se configura con 1000-1019 (20) usuarios de forma predeterminada, con una contraseña predeterminada de 1234. Puede saltar al paso de verificación de "prueba y verificación del paso 4" de antemano, iniciar sesión y marcar 5000, y puede escuchar la guía del menú de voz de muestra para el IVR predeterminado.
El servidor UNIMRCP en este ejemplo se compila e instala en CentOS 7. Gracias al código fuente del servidor UNIMRCP que se ha escrito para integrar el SDK IFLYTEK proporcionado por el usuario de GitHub Cotinyang.
1. Descargue el código fuente de demostración del complemento del servidor Unimrcp:
cd /opt
git clone https://github.com/cotinyang/MRCP-Plugin-Demo.git MRCP-Plugin-Demo2. Entorno de preparación de compilación
cd MRCP-Plugin-Demo/unimrcp-deps-1.5.0
# # 编译可能出现错误, 注释掉:107 ~ 109, getopt的set,其中存在不识别的option
# # 编译生成apr, apr-util, target path: ./libs
./build-dep-libs.shNota: 1. Debe ingresar y dos veces durante el proceso y confirmarlo; 2. Además, hemos bifurcado un proyecto que nos mantenemos para este proyecto de demostración, con la dirección https://github.com/wangkaisine/mrcp-plugin-demo, también puede usar el código fuente de esta dirección.
3. Compilar e instalar UNIMRCP
cd unimrcp-1.5.0
./bootstrap
# # 如果不能自动检测apr,apr-util,请在configure中增加 option:--with-apr=/path/apr --with-apr-util=/path/apr-util/
# # apr, apr-util由./build-dep-libs.sh 生成
./configure
make
make installPuede ver el UNIMRCP instalado en/usr/local/.
4. Prueba de ejecución
cd /usr/local/unimrcp/bin
./unimrcpserver -o 3Puede usar el cliente para verificar
cd /usr/local/unimrcp/bin
./unimrcpclient
> help
usage:
- run [app_name] [profile_name] (run demo application)
app_name is one of ' synth ' , ' recog ' , ' bypass ' , ' discover '
profile_name is one of ' uni2 ' , ' uni1 ' , ...
examples:
run synth
run recog
run synth uni1
run recog uni1
- loglevel [level] (set loglevel, one of 0,1...7)
- quit, exitIngrese Ayuda para ingresar, brinde el método de uso, ingrese Run Recog para ejecutar la prueba de reconocimiento de voz y ejecute el sintetizador para realizar la prueba de síntesis de voz.
1. Descarga de SDK de plataforma de desarrollo iflytek
Dado que el paquete SDK descargado de la plataforma Open Iflytek está asociado con los usuarios y las aplicaciones creadas por los usuarios, es necesario eliminar todos los archivos y carpetas en terceros/xfyun, y volver a descargar y descomponer su propio SDK. El directorio y el código fuente son básicamente los mismos.
Debe registrarse e iniciar sesión en la plataforma Iflytek Open, ingresar la página de la consola y crear una aplicación;
Obtenga su APPID en la interfaz My Apps y "agregue un nuevo servicio" para la aplicación, seleccione los servicios requeridos de "dictación de voz" y "síntesis de voz en línea" (requeridos en este ejemplo);
Haga clic en "Descargar SDK" a la derecha y confirme en la página de salto que "Seleccionar aplicación" ha seleccionado la aplicación que creó, "seleccione las capacidades de IA que necesita" Seleccione los dos servicios anteriores y haga clic en "Descargar SDK" para esperar a que el SDK se genere y complete la descarga.
Descomprima y reemplace todos los archivos y carpetas en MRCP-PLUGIN-DEMO/UNIMRCP-1.5.0/plugins/tercero/xfyun/.
Nota: Seleccione "Linux" para crear la plataforma de aplicación en la página de la aplicación.
2. Escritura y traducción de Plugin
Este paso le indicará cómo escribir el código de complemento para UNIMRCP, es decir, cómo obtener los archivos y las configuraciones relacionadas de las carpetas XFYUN_RECOG y XFYUN_XYNTH en las carpetas MRCP-PLUGIN-DEMO/UNIMRCP-1.5.0/Plugins. Si no está prestando atención a este detalle en este momento, puede omitir este paso al paso 4.
De hecho, el código MRCP-Plugin-Demo anterior es el código de complemento que descarga UNIMRCP 1.5.0 y UNIMRCP DEPS 1.5.0 en el sitio web oficial de UNIMRCP y agrega sobre esta base.
Primero edite el archivo configure.ac y la definición macro utilizada en elfile Make de lo siguiente. El complemento XFYUN Reconocyer se agrega de la siguiente manera:
dnl XFyun recognizer plugin.
UNI_PLUGIN_ENABLED(xfyunrecog)
AM_CONDITIONAL([XFYUNRECOG_PLUGIN],[test " ${enable_xfyunrecog_plugin} " = " yes " ])
...
plugins/xfyun-recog/Makefile
...
echo XFyun recognizer plugin....... : $enable_xfyunrecog_pluginNota: Entre ellos, ··· son otras configuraciones predeterminadas en este archivo. Encuentre la ubicación correspondiente para completar.
En consecuencia, la adición del complemento de sintetizador XFYUN es la siguiente:
dnl XFyun synthesizer plugin.
UNI_PLUGIN_ENABLED(xfyunsynth)
AM_CONDITIONAL([XFYUNSYNTH_PLUGIN],[test " ${enable_xfyunsynth_plugin} " = " yes " ])
···
plugins/xfyun-synth/Makefile
···
echo XFyun synthesizer plugin...... : $enable_xfyunsynth_pluginCódigo fuente y directorio agregado
En el directorio de complementos, cree un nuevo directorio XFYUN-REGG y cree un nuevo directorio SRC en este directorio. Puede copiar Demo_recog_engine.c a este directorio y cambiarlo a xfyun_recog_engine.c, y modificar el archivo xfyun_recog_engine.c (una parte modificada conocida: modificar el appid en el appid descargue el SDK usted mismo, de lo contrario, se informará un error: ¡Qisraudiowrite! Directorio Xfyun-Synth.
Cree un nuevo archivo MakeFile.am en la carpeta XFYUN-REG, con el siguiente contenido:
AM_CPPFLAGS = $( UNIMRCP_PLUGIN_INCLUDES )
plugin_LTLIBRARIES = xfyunrecog.la
xfyunrecog_la_SOURCES = src/xfyun_recog_engine.c
xfyunrecog_la_LDFLAGS = $( UNIMRCP_PLUGIN_OPTS )
-L $( top_srcdir ) /plugins/third-party/xfyun/libs/x64
-lmsc -ldl -lpthread -lrt -lstdc++
xfyunrecog_ladir = $( libdir )
xfyunrecog_la_DATA = $( top_srcdir ) /plugins/third-party/xfyun/libs/x64/libmsc.so
include $( top_srcdir ) /build/rules/uniplugin.am
UNIMRCP_PLUGIN_INCLUDES += -I $( top_srcdir ) /plugins/third-party/xfyun/includeEn consecuencia, cree una nueva carpeta MakeFile.am en la carpeta Fyun-Synth, con el siguiente contenido:
AM_CPPFLAGS = $( UNIMRCP_PLUGIN_INCLUDES )
plugin_LTLIBRARIES = xfyunsynth.la
xfyunsynth_la_SOURCES = src/xfyun_synth_engine.c
xfyunsynth_la_LDFLAGS = $( UNIMRCP_PLUGIN_OPTS )
-L $( top_srcdir ) /plugins/third-party/xfyun/libs/x64
-lmsc -ldl -lpthread -lrt
xfyunsynth_ladir = $( libdir )
include $( top_srcdir ) /build/rules/uniplugin.am
UNIMRCP_PLUGIN_INCLUDES += -I $( top_srcdir ) /plugins/third-party/xfyun/includeModifique el archivo Makefile.am en la carpeta de complementos y agregue el contenido de Xfyun-Recog de la siguiente manera:
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-recog
endifEn consecuencia, el contenido agregado a xfyun-synth es el siguiente:
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-synth
endifModifique el archivo conf/unimrcpserver.xml y cambie de habilitar el motor de demostración de forma predeterminada para habilitar nuestros dos motores.
Xfyun-REG se modifica de la siguiente manera:
< engine id = " Demo-Recog-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Recog-1 " name = " xfyunrecog " enable = " true " />En consecuencia, Xfyun-Synth se modifica de la siguiente manera:
< engine id = " Demo-Synth-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Synth-1 " name = " xfyunsynth " enable = " true " />Al mismo tiempo, si está listo para conectar UNIMRCP Server y Freeswitch, debe configurar la dirección IP del servidor en conf/unimrcpserver.xml, es decir, la dirección de acceso de subred de la instalación actual de UNIMRCP.
Recompire e instale UNIMRCP (Paso 2 3).
Cuando comienzas el siguiente problema:
- No se pudo cargar dso: /usr/local/unimrcp/lib/libmsc.so: símbolo indefinido: _ztvn10__cxxabiv117__class_type_infoe
SEX: -lstdc ++
- ./unimrcpserver: error al cargar bibliotecas compartidas: libsofia-sip-ua.so.0: No se puede abrir el archivo de objeto compartido: no hay dicho archivo o directorio
arreglar:
在etc/ld.so.conf 内容增加: /usr/local/lib
ldconfig 将ld.so.conf读入cacheConfigurar Freeswitch
Necesitamos conectar ambos Freeswitch que maneja las llamadas de voz del usuario y el servidor UNIMRCP que envía solicitudes al motor XFYUN.
1. Configure el módulo UNIMRCP y cárguelo automáticamente;
# 编辑/usr/local/src/freeswitch/modules.conf文件,找到要安装的模块,去掉前面的注释符号#
cd /usr/local/src/freeswitch
vim modules.conf
# asr_tts/mod_unimrcp
asr_tts/mod_unimrcp
# 执行make mod_xxx-install命令,这样就编译相应模块,并把编译后的动态库安装的/usr/local/freeswitch/mod目录下
make mod_unimrcp-install
# 编辑/usr/local/freeswitch/conf/autoload_configs/modules.conf.xml,去掉注释符号,如果没有发现对应模块,则添加
< load module= " mod_unimrcp " / >2. Establezca el archivo de perfil y el archivo conf;
Cree un nuevo archivo de configuración unimrcpserver-mrcp-v2.xml en el directorio/usr/local/freeswitch/conf/mrcp_profiles:
< include >
<!-- UniMRCP Server MRCPv2 -->
<!-- 后面我们使用该配置文件,均使用 name 作为唯一标识,而不是文件名 -->
< profile name = " unimrcpserver-mrcp2 " version = " 2 " >
<!-- MRCP 服务器地址 -->
< param name = " server-ip " value = " 192.168.1.23 " />
<!-- MRCP SIP 端口号 -->
< param name = " server-port " value = " 8060 " />
< param name = " resource-location " value = " " />
<!-- FreeSWITCH IP、端口以及 SIP 传输方式 -->
< param name = " client-ip " value = " 192.168.1.24 " />
< param name = " client-port " value = " 5069 " />
< param name = " sip-transport " value = " udp " />
< param name = " speechsynth " value = " speechsynthesizer " />
< param name = " speechrecog " value = " speechrecognizer " />
<!-- param name="rtp-ext-ip" value="auto"/ -->
< param name = " rtp-ip " value = " 192.168.1.24 " />
< param name = " rtp-port-min " value = " 4000 " />
< param name = " rtp-port-max " value = " 5000 " />
< param name = " codecs " value = " PCMU PCMA L16/96/8000 " />
<!-- Add any default MRCP params for SPEAK requests here -->
< synthparams >
</ synthparams >
<!-- Add any default MRCP params for RECOGNIZE requests here -->
< recogparams >
<!-- param name="start-input-timers" value="false"/ -->
</ recogparams >
</ profile >
</ include >Configure el /usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml archivo:
< configuration name = " unimrcp.conf " description = " UniMRCP Client " >
< settings >
<!-- UniMRCP profile to use for TTS -->
< param name = " default-tts-profile " value = " unimrcpserver-mrcp2 " />
<!-- UniMRCP profile to use for ASR -->
< param name = " default-asr-profile " value = " unimrcpserver-mrcp2 " />
<!-- 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 >Nota: 1. El servidor-IP en unimrcpserver-MRCP-v2.xml es la IP host iniciada por UniMRCPServer; 2. El cliente-IP y RTP-IP son los hosts iniciados por Freeswitch, y el puerto Freeswitch de puerto cliente accedido por el teléfono móvil como el cliente es 5060 de forma predeterminada, que es diferente de los dos; 3. El nombre del perfil en unimrcpserver-mrcp-v2.xml debe ser el mismo que el predeterminado-tts-perfil en unimrcp.conf.xml y el perfil predeterminado-ARS (algunos documentos dicen que el nombre del archivo XML en mrcp_profiles también debe ser consistente con estos dos, que en realidad no es insensible).
ATENION: Es importante implementar unimrcpserver y freeswitch en el mismo segmento de red. Es mejor realizar la prueba en la misma máquina física al implementarla.
3. Configurar IVR y scripts.
Agregue la siguiente configuración en /usr/local/freeswitch/conf/dialplan/default.xml:
< extension name = " unimrcp " >
< condition field = " destination_number " expression = " ^5001$ " >
< action application = " answer " />
< action application = " lua " data = " names.lua " />
</ condition >
</ extension >Agregue el script names.lua en el directorio/usr/local/freeswitch/scripts:
session : answer ()
-- freeswitch.consoleLog("INFO", "Called extension is '".. argv[1]"'n")
welcome = " ivr/ivr-welcome_to_freeswitch.wav "
menu = " ivr/ivr-this_ivr_will_let_you_test_features.wav "
--
grammar = " hello "
no_input_timeout = 80000
recognition_timeout = 80000
confidence_threshold = 0.2
--
session : streamFile ( welcome )
-- freeswitch.consoleLog("INFO", "Prompt file is n")
tryagain = 1
while ( tryagain == 1 ) do
--
session : execute ( " play_and_detect_speech " , menu .. " detect:unimrcp {start-input-timers=false,no-input-timeout= " .. no_input_timeout .. " ,recognition-timeout= " .. recognition_timeout .. " } " .. grammar )
xml = session : getVariable ( ' detect_speech_result ' )
--
if ( xml == nil ) then
freeswitch . consoleLog ( " CRIT " , " Result is 'nil' n " )
tryagain = 0
else
freeswitch . consoleLog ( " CRIT " , " Result is ' " .. xml .. " ' n " )
tryagain = 0
end
end
--
-- put logic to forward call here
--
session : sleep ( 250 )
session : set_tts_params ( " unimrcp " , " xiaofang " );
session : speak ( "今天天气不错啊" );
session : hangup ()Necesitamos agregar un archivo de sintaxis Hello.gram al directorio/usr/local/freeswitch/grammar. Puede estar vacío. Debe cumplir con la especificación de sintaxis de reconocimiento de voz 1.0 estándar (denominado SRGS1.0 para abreviar). Este archivo de sintaxis ASR se puede usar al reconocerlo.
<? xml version = " 1.0 " encoding = " utf-8 " ?>
< grammar version = " 1.0 " xml : lang = " zh-cn " root = " Menu " tag-format = " semantics/1.0 "
xmlns=http://www.w3.org/2001/06/grammar
xmlns:sapi= " http://schemas.microsoft.com/Speech/2002/06/SRGSExtensions " ><!- 这些都是必不可少的-->
< rule id = " city " scope = " public " >
< one-of > <!-- 匹配其中一个短语-->
< item >北京</ item >
< item >上海</ item >
</ one-of >
</ rule >
< rule id = " cross " scope = " public " >
< one-of >
< item >到</ item >
< item >至</ item >
< item >飞往</ item >
</ one-of >
</ rule >
< rule id = " Menu " scope = " public " >
< item >
< ruleref uri = " #date " /> <!--指定关联的其他规则的节点-->
< tag >out.date = reles.latest();</ tag >
</ item >
< item repeat = " 0-1 " >从</ item > <!--显示1次或0次-->
< item >
< ruleref uri = " #city " />
< tag >out.city = rulels.latest();</ tag >
</ item >
< item >
< ruleref uri = " #cross " />
< tag >out.cross = rulels.latest();</ tag >
</ item >
< item >
< ruleref uri = " #city " />
< tag >out.city = rulels.latest();</ tag >
</ item >
</ rule >
</ grammar >Nota: En el script Lua, "Play_and_detect_speech" llama al servicio ASR, y "hablar" llama al servicio TTS. Encontré problemas durante el inicio de la configuración.
Descargue la herramienta de prueba: Adore SIP Client
Busque "Cliente SIP" Adore "en la App Store (para otros sistemas de teléfonos móviles, vaya al mercado de aplicaciones correspondiente) y descárguelo.

Entre ellos, SIP IP es la IP y el puerto host habilitados por el servicio Freeswitch (predeterminado es 5060), el nombre de usuario se puede seleccionar como 1000-1019 como se mencionó anteriormente, y la contraseña es 1234 de forma predeterminada. Haga clic en "Iniciar sesión" (asegúrese de que la red conectada al teléfono esté en la misma subred que Freeswitch) y marque 5001 para la verificación de la prueba de idioma (si saltó desde el primer paso, marque 5000).
Página de inicio de Freeswitch: https://freeswitch.com/
Página de inicio de UNIMRCP: http://www.unimrcp.org/
Apache Apr: https://apr.apache.org/
Método de importación del paquete iflytek SDK: https://doc.xfyun.cn/msc_linux/sdk%E5%8C%85%E5%af%BC%E5%85%A5.html