Githubは毎日ログインしていません。ご質問がある場合は、[email protected]に連絡して、暇なときに返信してください。ありがとう!
これは私の最初のgithubプロジェクトです。 COTINのウェブサイト「単純なインテリジェントなカスタマーサービスシステムの構築」(i)、(ii)、および(ii)建設プロセスの助けに感謝します。このチュートリアルを読む前に、最初にこれらの3つの記事を読むことができます。このチュートリアルは、これに基づいて建設注文を調整し、より多くの操作の詳細、エラー処理、その他の建設の説明を提供します。
FreeSwitchを使用してユーザーの携帯電話を受け入れ、Iflytek Open Platform(XFyun)プラグインを使用してIflytek Open Platform(XFyun)プラグインを統合して音声認識(ASR)を実行し、カスタムビジネスロジックに基づいて音声合成(TTS)を実行して、シンプルなエンドツーエンドの音声コールセンターを構築します。

この例のFreesWitchは、MacOS High Sierra 10.13.4システムバージョンにコンパイルおよびインストールされています。ソフトウェアパッケージを使用してインストールされていません。特定のインストール手順については、公式Webサイトのインストール紹介をご覧ください。 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は、デフォルトで1000-1019(20)ユーザーで設定され、デフォルトのパスワードは1234です。「ステップ4テストと検証」の検証ステップにジャンプして、事前にログインしてダイヤル5000で、デフォルトのIVRのサンプルボイスメニューガイドを聞くことができます。
この例のUNIMRCPサーバーは、Centos 7にコンパイルおよびインストールされています。GithubユーザーCotinyangが提供するIflytek SDKを統合するために書き込まれたUNIMRCPサーバーソースコードのおかげです。
1. UNIMRCP Serverプラグインデモソースコードをダウンロード:
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回入力して確認する必要があります。 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/inでインストールされている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ヘルプを入力し、使用方法を指定し、Run Recogを入力して音声認識テストを実行し、Synthを実行して音声合成テストを実行します。
1。Iflytek開発プラットフォームSDKダウンロード
IflytekオープンプラットフォームからダウンロードされたSDKパッケージは、ユーザーが作成したユーザーとアプリケーションに関連付けられているため、サードパーティ/XFyunのすべてのファイルとフォルダーを削除し、独自のSDKを再ダウンロードして解凍する必要があります。ディレクトリとソースコードは基本的に同じです。
iflytekオープンプラットフォームに登録してログインし、コンソールページに入り、アプリケーションを作成する必要があります。
アプリインターフェイスでAPPIDを取得し、アプリの「新しいサービスを追加」し、必要な「音声辞書」および「オンライン音声合成」サービス(この例に必要)を選択します。
右側の「SDKダウンロード」をクリックし、ジャンプページで「選択したアプリ」が作成したアプリケーションを選択し、「必要なAI機能」を選択し、上記の2つのサービスを選択し、「SDKダウンロード」をクリックして、SDKが生成および完了したダウンロードを待っていることを確認します。
mrcp-plugin-demo/unimrcp-1.5.0/plugins/shird-party/xfyun/の下にあるすべてのファイルとフォルダーを解凍して交換します。
注:「Linux」を選択して、アプリケーションページにアプリケーションプラットフォームを作成します。
2.執筆と翻訳を展開します
このステップでは、UNIMRCPのプラグインコードを書き込む方法、つまり、MRCP-Plugin-Demo/unimrcp-1.5.0/プラグインフォルダーのxfyun_recogおよびxfyun_xynthフォルダーのファイルと関連する構成を取得する方法を説明します。現時点でこの詳細に注意を払っていない場合は、このステップをスキップしてステップ4にできます。
実際、上記のMRCP-Plugin-Demoコードは、UNIMRCPの公式WebサイトにUNIMRCP 1.5.0およびUNIMRCP DEPS 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 Synthesizerプラグインの追加は次のとおりです。
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ソースコードとディレクトリが追加されました
Plugins Directoryで、新しいXfyun-Recogディレクトリを作成し、このディレクトリの下に新しいSRCディレクトリを作成します。 demo_recog_engine.cをこのディレクトリにコピーしてxfyun_recog_engine.cに変更し、xfyun_recogog_engine.cファイルを変更できます(既知の修正部品:sdkをダウンロードするappidを変更します。ディレクトリ。
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ファイルを変更し、デフォルトでデモエンジンを有効にすることから、2つのエンジンを有効にするために変更します。
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。クライアント-IPとRTP-IPは、FreesWitchが開始したホストであり、クライアントが携帯電話がアクセスするクライアントポートFreesWitchポートは、クライアントがデフォルトで5060であるため、2つとは異なります。 3. unimrcpserver-mrcp-v2.xmlのプロファイル名は、unimrcp.conf.xmlおよびdefault-ars-profileのデフォルト-tts-profileと同じである必要があります(MRCP_ProfilesのXMLファイル名も、これら2つと一致する必要があります)。
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ディレクトリにname.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サービスを呼び出します。構成の起動中に問題が発生しました。
テストツールをダウンロード:SIPクライアントが崇拝します
アプリストア(他の携帯電話システムについては、対応するアプリケーション市場にアクセスしてください)で「Adore SIPクライアント」を検索してダウンロードしてください。

その中で、SIP IPはFreesWitchサービスで有効になっているホストIPおよびポート(デフォルトは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%AFBC%E5%85%A5.html