Github는 매일 로그인되지 않습니다. 궁금한 점이 있으시면 [email protected]으로 문의하여 여가 시간에 회신하십시오. 감사합니다!
이것은 나의 첫 번째 Github 프로젝트입니다. Cotin 웹 사이트 "간단한 지능형 고객 서비스 시스템 구축"(i), (ii) 및 (ii) 건설 프로세스의 도움에 감사드립니다. 이 튜토리얼을 읽기 전에 먼저이 세 기사를 읽을 수 있습니다. 이 자습서는이를 기반으로 시공 순서를 조정하고 더 많은 작동 세부 사항, 오류 처리 및 기타 건설 설명을 제공합니다.
Freeswitch를 사용하여 사용자 휴대 전화 통화를 수락하고 Iflytek Open Platform (XFYUN) 플러그인을 사용하여 IflyTek Open Platform (XFYUN) 플러그인을 통합하여 음성 인식 (ASR)을 수행하고 맞춤형 비즈니스 로직을 기반으로 TTS (Call Voice Synthesis)를 통합하여 간단한 엔드 투 엔드 음성 통화 센터를 구축하십시오.

이 예제의 FreeSwitch는 MacOS High Sierra 10.13.4 시스템 버전에 컴파일 및 설치되었습니다. 소프트웨어 패키지를 사용하여 설치되지 않습니다. 특정 설치 단계는 공식 웹 사이트 설치 소개를 참조하십시오. Linux (Ubuntu, Centos)와 같은 다른 플랫폼을 성공적으로 설치해야합니다.
다음은 소스 코드 컴파일 및 설치 단계입니다.
1. FreeSwitch 소스 코드 다운로드 :
cd /usr/local/src
git clone -b v1.6 https://freeswitch.org/stash/scm/fs/freeswitch.git freeswitch2. 종속성 라이브러리를 설치하십시오
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 libsndfile참고 : 다른 시스템 플랫폼의 경우 종속성 라이브러리 콘텐츠를 직접 확인하십시오. 가능한 검색 결과 : Ubuntu/Centos FreeSwitch 설치 종속성. Ubuntu에서 : Libtool은 찾을 수 없습니다.
3. 컴파일 및 설치
cd freeswitch/
# 先执行 bootstrap.sh,生成configure文件
./bootstrap.sh
./configure --prefix=/usr/local/freeswitch
make
make install
make cd-sounds-install
make cd-moh-install4. 실행
cd /usr/local/freeswitch/bin
./freeswitch응용 프로그램을 시작할 수 있습니다.
참고 : 설치 중에 발생할 수있는 문제. 구성 오류.
FreeSwitch는 기본 비밀번호가 1234 인 기본적으로 1000-1019 (20) 사용자로 구성됩니다. "4 단계 테스트 및 확인"의 확인 단계로 이동하여 사전에 로그인하고 5000으로 전화 할 수 있으며 기본 IVR의 샘플 음성 메뉴 가이드를들을 수 있습니다.
이 예제의 UNIMRCP 서버는 CentOS 7에 컴파일되고 설치되어 있습니다. GitHub 사용자 Cotinyang이 제공 한 IflyTek SDK를 통합하기 위해 작성된 UnimRCP 서버 소스 코드 덕분입니다.
1. UnimRCP 서버 플러그인 데모 소스 코드 다운로드 :
cd /opt
git clone https://github.com/cotinyang/MRCP-Plugin-Demo.git MRCP-Plugin-Demo2. 컴파일 준비 환경
cd MRCP-Plugin-Demo/unimrcp-deps-1.5.0
# # 编译可能出现错误, 注释掉:107 ~ 109, getopt的set,其中存在不识别的option
# # 编译生成apr, apr-util, target path: ./libs
./build-dep-libs.sh참고 : 1. 과정에서 Y를 두 번 입력하고 확인해야합니다. 2. 또한, 우리는이 데모 프로젝트를 위해 스스로를 유지하는 프로젝트를 포장했으며, 주소는 https://github.com/wangkaisine/mrcp-plugin-demo이 주소의 소스 코드를 사용할 수 있습니다.
3. 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 install/usr/local/에서 설치된 UNIMRCP를 볼 수 있습니다.
4. 테스트 실행
cd /usr/local/unimrcp/bin
./unimrcpserver -o 3클라이언트를 사용하여 확인할 수 있습니다
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, exit입력을 입력하고, 사용법을 제공하고, 실행 리코그를 입력하여 음성 인식 테스트를 실행하고, 신디사이저를 실행하여 음성 합성 테스트를 수행하십시오.
1. Iflytek Development Platform SDK 다운로드
IflyTek Open 플랫폼에서 다운로드 한 SDK 패키지는 사용자가 작성한 사용자 및 응용 프로그램과 관련이 있으므로 타사/XFYUN에서 모든 파일과 폴더를 삭제하고 자신의 SDK를 다시 다운로드하고 압축해야합니다. 디렉토리 및 소스 코드는 기본적으로 동일합니다.
iflytek 오픈 플랫폼에 등록하고 로그인하고 콘솔 페이지를 입력 한 다음 응용 프로그램을 작성해야합니다.
My Apps 인터페이스에서 AppId를 가져 와서 앱의 "새 서비스 추가"를 받으십시오. 필요한 "음성 받아 들여진"및 "온라인 음성 합성"서비스 (이 예에서 필수)를 선택하십시오.
오른쪽에서 "SDK 다운로드"를 클릭하고 "선택한 APP"가 선택한 응용 프로그램을 선택한 점프 페이지에서 확인하십시오.
Mrcp-Plugin-Demo/Unimrcp-1.5.0/플러그인/Third-Party/Xfyun/의 모든 파일과 폴더를 압축하고 교체하십시오.
참고 : "Linux"를 선택하여 응용 프로그램 페이지에서 응용 프로그램 플랫폼을 만듭니다.
2. 플러그 린 쓰기 및 번역
이 단계에서는 UNIMRCP 용 플러그인 코드를 작성하는 방법, 즉 MRCP-PLUGIN-DEMO/UNIMRCP-1.5.0/플러그인 폴더에서 XFYUN_RECOG 및 XFYUN_XYNTH 폴더의 파일 및 관련 구성 방법을 알려줍니다. 현재이 세부 사항에주의를 기울이지 않으면이 단계를 4 단계로 건너 뛸 수 있습니다.
실제로 위의 MRCP-Plugin-Demo 코드는 UNIMRCP의 공식 웹 사이트에서 UNIMRCP 1.5.0 및 UNIMRCP DEP 1.5.0을 다운로드 하고이 기준을 추가하는 플러그인 코드입니다.
먼저 configure.ac 파일과 makefile에 사용 된 매크로 정의를 다음과 같이 편집하십시오. XFYUN 인식기 플러그인은 다음과 같이 추가됩니다.
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_plugin참고 : 그중에서도이 파일의 다른 기본 구성이 있습니다. 채우는 해당 위치를 찾으십시오.
이에 따라 Xfyun 신시사이저 플러그인의 추가는 다음과 같습니다.
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_plugin소스 코드 및 디렉토리가 추가되었습니다
플러그인 디렉토리에서 새 Xfyun-Recog 디렉토리를 만들고이 디렉토리에서 새 SRC 디렉토리를 만듭니다. demo_recog_engine.c를이 디렉토리에 복사하여 xfyun_recog_engine.c로 변경하고 xfyun_recog_engine.c 파일 (수정 된 부분 : SDK를 직접 다운로드 한 appid를 수정합니다. xfyun-synth 디렉토리.
다음 내용으로 Xfyun-Recog 폴더에서 새 makefile.am 파일을 만듭니다.
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/include이에 따라 Fyun-Synth 폴더 아래에 새로운 makefile.am 폴더를 작성하십시오.
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/include플러그인 폴더에서 makefile.am 파일을 수정하고 다음과 같이 Xfyun-Recog의 내용을 추가하십시오.
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-recog
endif이에 따라 Xfyun-Synth에 추가 된 내용은 다음과 같습니다.
if XFYUNRECOG_PLUGIN
SUBDIRS += xfyun-synth
endifconf/unimrcpserver.xml 파일을 수정하고 기본적으로 데모 엔진 활성화에서 두 엔진 활성화로 변경하십시오.
Xfyun-Recog는 다음과 같이 수정됩니다.
< engine id = " Demo-Recog-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Recog-1 " name = " xfyunrecog " enable = " true " />이에 따라 Xfyun-synth는 다음과 같이 수정됩니다.
< engine id = " Demo-Synth-1 " name = " demorecog " enable = " false " />
< engine id = " XFyun-Synth-1 " name = " xfyunsynth " enable = " true " />동시에, UnimRCP 서버와 FreeSwitch를 연결할 준비가되면 Conf/UnimrcPserver.xml, 즉 현재 Unimrcp 설치의 서브넷 액세스 주소로 서버의 IP 주소를 구성해야합니다.
UNIMRCP를 다시 컴파일하고 설치하십시오 (2 단계 3).
다음 문제를 시작할 때 :
- dso : /usr/local/unimrcp/lib/libmsc.so를로드하지 못했습니다
수정 : -lstdc ++
- ./unimrcpserver : 공유 라이브러리를로드하는 동안 오류 : Libsofia-Sip-ua.so.0 : 공유 객체 파일을 열 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
고치다:
在etc/ld.so.conf 内容增加: /usr/local/lib
ldconfig 将ld.so.conf读入cacheFreeSwitch를 구성하십시오
사용자 음성 통화를 처리하는 FreeSwitch와 Xfyun 엔진에 요청을 보내는 UnimRCP 서버를 모두 연결해야합니다.
1. UnimRCP 모듈을 구성하고 자동으로로드하십시오.
# 编辑/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. 프로필 파일과 conf 파일을 설정하십시오.
/usr/local/freeswitch/conf/mrcp_profiles 디렉토리에서 새 unimrcpserver-mrcp-v2.xml 구성 파일을 만듭니다.
< 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 >/usr/local/freeswitch/conf/autoload_configs/unimrcp.conf.xml 파일을 구성하십시오.
< 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 >참고 : 1. UnimrcPserver-mrcp-v2.xml의 서버 -IP는 UnimrcPserver가 시작한 호스트 IP입니다. 2. Client-IP 및 RTP-IP는 FreeSwitch가 시작한 호스트이며 클라이언트가 기본적으로 5060이므로 휴대 전화에서 액세스 한 Client-Port FreeSwitch 포트는 2와 다릅니다. 3. UnimrcPserver-mrcp-v2.xml의 프로파일 이름은 unimrcp.conf.xml의 기본 -tts-profile과 동일해야하며 (일부 문서에서는 MRCP_PROFILE의 XML 파일 이름 도이 두 가지와 일치해야한다고 말합니다.
ATTENION : 동일한 네트워크 세그먼트에 UnimrcPserver 및 FreeSwitch를 배치하는 것이 중요합니다. 배포 할 때 동일한 물리적 기계에서 테스트를 수행하는 것이 가장 좋습니다.
3. IVR 및 스크립트를 구성하십시오.
/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 >/usr/local/freeswitch/scripts 디렉토리에 names.lua 스크립트를 추가하십시오.
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 ()/usr/local/freeswitch/grammar 디렉토리에 hello.gram 구문 파일을 추가해야합니다. 비어있을 수 있습니다. 음성 인식 구문 사양 1.0 표준을 충족해야합니다 (SRGS1.0이라고 함). 이 구문 파일 ASR 엔진은 인식 할 때 사용할 수 있습니다.
<? 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 >참고 : LUA 스크립트에서 "play_and_detect_speech"는 ASR 서비스를 호출하고 "speak"는 TTS 서비스를 호출합니다. 구성 시작 중에 문제가 발생했습니다.
테스트 도구 : Adore SIP 클라이언트를 다운로드하십시오
App Store (다른 휴대 전화 시스템의 경우 해당 응용 프로그램 시장으로 이동)에서 "Adore Sip Client"를 검색하고 다운로드하십시오.

그중 SIP IP는 호스트 IP 및 FreeSwitch Service (기본값은 5060), 사용자 이름을 위에서 언급 한대로 1000-1019로 선택할 수 있으며 비밀번호는 기본적으로 1234입니다. "로그인"을 클릭하십시오 (전화에 연결된 네트워크가 FreeSwitch와 동일한 서브넷에 있는지 확인하십시오), 언어 테스트 확인을 위해 5001에 전화를 걸십시오 (첫 번째 단계에서 뛰어 내린 경우 5000으로 전화하십시오).
Freeswitch 홈페이지 : https://freeswitch.com/
Unimrcp 홈페이지 : http://www.unimrcp.org/
Apache APR : https://apr.apache.org/
IflyTek SDK 패키지 가져 오기 방법 : https://doc.xfyun.cn/msc_linux/sdk%E5%8C%85%E5%AF%BC%E5%85%A5.html