O Github não está logado todos os dias. Se você tiver alguma dúvida, entre em contato com [email protected] e responda no seu tempo livre. Obrigado!
Este é o meu primeiro projeto do GitHub. Gostaria de agradecer ao site da Cotin "Construindo um sistema de atendimento ao cliente inteligente simples" (i), (ii) e (ii) pela ajuda do processo de construção. Antes de ler este tutorial, você pode ler esses três artigos primeiro. Este tutorial ajusta a ordem de construção com base nisso e fornece mais detalhes da operação, tratamento de erros e outras descrições de construção.
Use o Freeswitch para aceitar chamadas telefônicas móveis de usuário, use o plug-in da IFlytek Open Platform (XFYUN) para integrar o plug-in da IFLYTEK Open Platform (XFYUN) para executar o reconhecimento de voz (ASR) e a síntese de voz de chamadas (TTS) com base na lógica de negócios personalizada para criar um simples center de lida de voz de ponta final.

Freeswitch Neste exemplo é compilado e instalado na versão do sistema MacOS High Sierra 10.13.4. Não está instalado usando pacotes de software. Para as etapas específicas de instalação, consulte a introdução oficial da instalação do site. Outras plataformas como Linux (Ubuntu, Centos) devem ser instaladas com sucesso.
A seguir, estão as etapas para compilação e instalação do código -fonte:
1. Faça o download do código fonte do Freeswitch:
cd /usr/local/src
git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch2. Instale a biblioteca de dependência
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 outras plataformas do sistema, confirme o conteúdo da biblioteca de dependência por si mesmo. Possíveis resultados de pesquisa: Ubuntu/CentOS Freeswitch dependências de instalação. Sob Ubuntu: Libtool não 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. Corra
cd /usr/local/freeswitch/bin
./freeswitchVocê pode iniciar o aplicativo.
Nota: Problemas que podem ocorrer durante a instalação. Erros na configuração.
O Freeswitch está configurado com 1000-1019 (20) usuários por padrão, com uma senha padrão de 1234. Você pode pular para a etapa de verificação do "Teste e verificação da Etapa 4" com antecedência, efetuar login e discar 5000 e ouvir o guia de menu de voz da amostra para o IVR default.
O servidor UnimRCP neste exemplo é compilado e instalado no CentOS 7. Graças ao código -fonte do servidor UnimRCP que foi gravado para integrar o IFLYTEK SDK fornecido pelo usuário do Github Cotinyang.
1. Baixe o código -fonte da demonstração do plugin do UNIMRCP Server:
cd /opt
git clone https://github.com/cotinyang/MRCP-Plugin-Demo.git MRCP-Plugin-Demo2. Ambiente de preparação de compilação
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. Você precisa entrar em Y duas vezes durante o processo e confirmá -lo; 2. Além disso, bifurcemos um projeto que nos mantemos para este projeto de demonstração, com o endereço sendo https://github.com/wangkaisine/mrcp-plugin-demo Você também pode usar o código-fonte deste endereço.
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 installVocê pode ver o Unimrcp instalado em/usr/local/.
4. Execução de teste
cd /usr/local/unimrcp/bin
./unimrcpserver -o 3Você pode usar o 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, exitDigite a ajuda para entrar, dê o método de uso, insira o RUN RECOG para executar o teste de reconhecimento de fala e execute o Synth para executar o teste de síntese de fala.
1. Plataforma de desenvolvimento iflytek download SDK
Como o pacote SDK baixado da Iflytek Open Platform está associado a usuários e aplicativos criados pelos usuários, é necessário excluir todos os arquivos e pastas em terceiros/xfyun e fazer o download e descompactar seu próprio SDK. O diretório e o código -fonte são basicamente os mesmos.
Você precisa se registrar e fazer login na plataforma aberta do iflytek, inserir a página do console e criar um aplicativo;
Obtenha seu Appid na interface do My Apps e "Adicione um novo serviço" para o aplicativo, selecione os serviços "ditado por voz" e "síntese de voz on -line" (exigidos neste exemplo);
Clique em "SDK Download" à direita e confirme na página de salto que "Select App" selecionou o aplicativo que você criou ", selecione os recursos de IA necessários" Selecione os dois serviços acima e clique em "SDK Download" para aguardar o SDK a ser gerado e concluído.
Descompacte e substitua todos os arquivos e pastas em MRCP-PLUGIN-DEMO/UNIMRCP-1.5.0/Plugins/terceiros/xfyun/.
Nota: Selecione "Linux" para criar a plataforma de aplicativos na página de aplicativos.
2.Plugin Writing and Translation
Esta etapa informará como escrever o código do plug-in para o Unimrcp, ou seja, como obter os arquivos e as configurações relacionadas das pastas XFYUN_RECOG e XFYUN_XYNTH nas pastas MRCP-Plugin-Demo/Unimrcp-1.5.0/Plugins. Se você não estiver prestando atenção a esse detalhe no momento, poderá pular esta etapa para a etapa 4.
De fato, o código MRCP-PLUGIN-DEMO acima é o código do plug-in que baixará o Unimrcp 1.5.0 e o Unimrcp Deps 1.5.0 no site oficial da Unimrcp e adiciona nisso.
Primeiro edite o arquivo configure.ac e a definição de macro usada no makefile a seguir. O plug -in de reconhecimento do XFYUN é adicionado da seguinte forma:
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 eles, ··· estão outras configurações padrão neste arquivo. Encontre o local correspondente para preencher.
Da mesma forma, a adição do plugin XFYUN Synthesizer é a seguinte:
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_pluginAdicionado código -fonte e diretório
No diretório do plugins, crie um novo diretório XFYUN-RECOG e crie um novo diretório SRC neste diretório. Você pode copiar Demo_recog_engine.c para este diretório e alterá-lo para xfyun_recog_engine.c, e modificar o arquivo xfyun_recog_engine.c (uma parte modificada conhecida: modificar o que é falhado no Apid. diretório.
Crie um novo arquivo makefile.am na pasta XFYUN-RECOG, com o seguinte conteúdo:
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/includeDa mesma forma, crie uma nova pasta Makefile.am sob a pasta Fyun-Synth, com o seguinte conteúdo:
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 o arquivo makefile.am na pasta Plugins e adicione o conteúdo do XFYUN-RECOG da seguinte forma:
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-recog
endifDa mesma forma, o conteúdo adicionado ao XFYUN-Synth é o seguinte:
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-synth
endifModifique o arquivo conf/unimrcpServer.xml e altere a ativação do mecanismo de demonstração por padrão para ativar nossos dois motores.
XFYUN-RECOG é modificado da seguinte forma:
< engine id = " Demo-Recog-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Recog-1 " name = " xfyunrecog " enable = " true " />Correspondentemente, o xfyun-synth é modificado da seguinte forma:
< engine id = " Demo-Synth-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Synth-1 " name = " xfyunsynth " enable = " true " />Ao mesmo tempo, se você estiver pronto para conectar o UNIMRCP Server e o Freeswitch, você deverá configurar o endereço IP do servidor em conf/unmrcpServer.xml, ou seja, o endereço de acesso da sub -rede da instalação do UNIMRCP atual.
Recompilar e instalar Unimrcp (Etapa 2 3).
Quando você inicia o seguinte problema:
- Falha ao carregar dso: /usr/local/unimrcp/lib/libmsc.so: símbolo indefinido: _ztvn10__cxabiv117__class_type_infoe
Correção: -lstdc ++
- ./unimrcpServer: Erro ao carregar bibliotecas compartilhadas: libsofia-sip-ua.so.0: Não é possível abrir o arquivo de objeto compartilhado: nenhum arquivo ou diretório
consertar:
在etc/ld.so.conf 内容增加: /usr/local/lib
ldconfig 将ld.so.conf读入cacheConfigure Freeswitch
Precisamos conectar o Freeswitch que lida com chamadas de voz do usuário e o servidor Unimrcp que envia solicitações ao mecanismo XFYUN.
1. Configure o módulo Unimrcp e carregue -o automaticamente;
# 编辑/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. Defina o arquivo de perfil e o arquivo conf;
Crie um novo arquivo de configuração unimrcpServer-mrcp-v2.xml no diretório/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 o /usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml arquivo:
< 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. O servidor-IP no UnimrcpServer-MRCP-V2.xml é o IP do host iniciado pelo UnimrcPServer; 2. O cliente-IP e o RTP-IP são os hosts iniciados pela Freeswitch, e a porta do cliente FreeSwitch acessada pelo telefone celular como o cliente é 5060 por padrão, o que é diferente dos dois; 3. O nome do perfil no UnimrcpServer-mrcp-v2.xml deve ser o mesmo que o padrão-tts-perfil em Unimrcp.conf.xml e o padrão-ar-perfil (alguns documentos dizem que o nome do arquivo XML em MRCP_Profiles deve ser consistente com esses dois, que realmente são não-nacionais).
Atenion: É importante implantar UnimrcPServer e FreeSwitch no mesmo segmento de rede. É melhor executar o teste na mesma máquina física ao implantá -la.
3. Configure o IVR e os scripts.
Adicione a seguinte configuração em /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 >Adicione o script nomes.lua no diretório/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 ()Precisamos adicionar um arquivo de sintaxe hello.gram ao diretório/usr/local/freeswitch/gramática. Pode estar vazio. Ele deve atender ao padrão de sintaxe de reconhecimento de fala 1.0 (referido como SRGS1.0 para abreviar). Este mecanismo ASR de arquivo de sintaxe pode ser usado ao reconhecê -lo.
<? 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: No script Lua, "play_and_detect_speech" chama o serviço ASR e "speak" chama o serviço TTS. Encontrei problemas durante a inicialização da configuração.
Baixe a ferramenta de teste: Adore SIP Client
Pesquise "Adore SIP Client" na App Store (para outros sistemas de telefonia móvel, vá para o mercado de aplicativos correspondente) e faça o download.

Entre eles, o SIP IP é o IP do host e a porta ativada pelo serviço Freeswitch (o padrão é 5060), o nome do usuário pode ser selecionado como 1000-1019, como mencionado acima, e a senha é 1234 por padrão. Clique em "Login" (verifique se a rede conectada ao telefone está na mesma sub -rede que Freeswitch) e disque 5001 para verificação do teste de idiomas (se você saltou da primeira etapa, disque 5000).
Página inicial do Freeswitch: https://freeswitch.com/
UNIMRCP HOMEPAGEM: http://www.unimrcp.org/
Apache APR: https://apr.apache.org/
IFLYTEK SDK PACOTO Método de importação: https://doc.xfyun.cn/msc_linux/sdk%E5%8c%85%E5%AF%BC%E5%85%A5.html