لم يتم تسجيل Github في كل يوم. إذا كان لديك أي أسئلة ، فيرجى الاتصال بـ [email protected] والرد في وقت فراغك. شكرًا لك!
هذا هو أول مشروع لي. أود أن أشكر موقع Cotin على الويب "بناء نظام خدمة عملاء ذكي بسيط" (1) و (2) و (2) لمساعدة عملية البناء. قبل قراءة هذا البرنامج التعليمي ، يمكنك قراءة هذه المقالات الثلاثة أولاً. يقوم هذا البرنامج التعليمي بضبط أمر البناء بناءً على هذا ويعطي المزيد من تفاصيل التشغيل ومعالجة الأخطاء وأوصاف البناء الأخرى.
استخدم FreesWitch لقبول المكالمات الهاتفية المحمولة للمستخدم ، واستخدم المكون الإضافي Iflytek Open Platform (XFYUN) لدمج المكون الإضافي من النظام الأساسي المفتوح (XFYUN) لأداء التعرف على الصوت (ASR) ، واستدعاء التوليف الصوتي (TTS) بناءً على منطق عمل مخصص لإنشاء مركز اتصال صوتي بسيط إلى النهاية.

يتم تجميع 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. تحت أوبونتو: لم يتم العثور على 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. بفضل رمز مصدر خادم UNIMRCP الذي تمت كتابته لدمج Iflytek SDK الذي توفره Github User Cotinyang.
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. بالإضافة إلى ذلك ، قمنا بتخليص مشروع نحافظ على أنفسنا لهذا المشروع التجريبي ، حيث كان العنوان 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يمكنك رؤية UNIMRCP المثبت في/usr/local/.
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 Open Platform مرتبطة بالمستخدمين والتطبيقات التي أنشأها المستخدمون ، فمن الضروري حذف جميع الملفات والمجلدات في الطرف الثالث/xfyun ، وإعادة التنزيل وإلغاء ضغط SDK الخاص بك. الدليل ورمز المصدر متماثلان بشكل أساسي.
تحتاج إلى تسجيل وتسجيل الدخول إلى منصة IfLytek Open ، وإدخال صفحة وحدة التحكم ، وإنشاء تطبيق ؛
احصل على تطبيقك في واجهة التطبيقات الخاصة بي و "إضافة خدمة جديدة" للتطبيق ، حدد خدمات "الإملاء الصوتي" و "التوليف الصوتي عبر الإنترنت" (المطلوب في هذا المثال) ؛
انقر فوق "SDK Download" على اليمين ، وتأكيد في صفحة Jump التي حددت "Select App" التطبيق الذي أنشأته ، "حدد إمكانيات AI التي تحتاجها" حدد الخدمتين أعلاه ، وانقر فوق "SDK Download" لانتظار إنشاء SDK وإكماله.
قم بإلغاء الضغط واستبدل جميع الملفات والمجلدات تحت MRCP-Plugin-DEMO/unimrcp-1.5.0/Plugins/Third-Thrugle/Xfyun/.
ملاحظة: حدد "Linux" لإنشاء منصة التطبيق في صفحة التطبيق.
2. كتابة وترجمة بلوجين
سوف تخبرك هذه الخطوة كيفية كتابة رمز المكونات الإضافية لـ unimrcp ، أي كيفية الحصول على الملفات والتكوينات ذات الصلة لجدول XFYUN_RECOG و XFYUN_XYNTH في مجلدات MRCP-Plugin-DEMO/UNIMRCP-1.5.0/الإضافات. إذا كنت لا تهتم بهذه التفاصيل في الوقت الحالي ، فيمكنك تخطي هذه الخطوة إلى الخطوة 4.
في الواقع ، فإن رمز MRCP-Plugin-DEMO هو رمز البرنامج المساعد الذي يقوم بتنزيل UNIMRCP 1.5.0 و UNIMRCP DEPS 1.5.0 على الموقع الرسمي لـ UNIMRCP ويضيف على هذا الأساس.
قم أولاً بتحرير ملف 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 (جزء معدّل معروف! دليل Xfyun-Synth.
قم بإنشاء ملف makefile.am جديد في مجلد Xfyun-Recog ، مع المحتوى التالي:
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في المقابل ، قم بإنشاء مجلد جديد Makefile.am تحت مجلد Fyun-Synth ، مع المحتوى التالي:
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
endifقم بتعديل ملف conf/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 ، فيجب عليك تكوين عنوان IP الخاص بالخادم في Conf/unimrcpserver.xml ، أي عنوان الوصول الفرعي لتثبيت UNIMRCP الحالي.
إعادة ترجمة وتثبيت unimrcp (الخطوة 2 3).
عندما تبدأ المشكلة التالية:
- فشل في تحميل dso: /usr/local/unimrcp/lib/libmsc.so: رمز غير محدد: _ztvn10__cxxabiv117 __class_type_infoe
إصلاح: -lstdc ++
- ./unimrcpserver: خطأ أثناء تحميل المكتبات المشتركة: libsofia-sip-ua.s.0: لا يمكن فتح ملف الكائن المشترك: لا يوجد ملف أو دليل
يصلح:
在etc/ld.so.conf 内容增加: /usr/local/lib
ldconfig 将ld.so.conf读入cacheتكوين freeswitch
نحتاج إلى توصيل كل من Freeswitch الذي يتولى المكالمات الصوتية للمستخدم وخادم UNIMRCP الذي يرسل طلبات إلى محرك XFYUN.
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 ؛
قم بإنشاء ملف تكوين unimrcpserver-mrcp-v2.xml جديد في دليل/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 >تكوين /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. الخادم IP في unimrcpserver-mrcp-v2.xml هو IP المضيف الذي بدأه unimrcpserver ؛ 2. العميل-IP و RTP-IP هم المضيفين الذي بدأه Freeswitch ، ومنفذ Freeswitch العميل الذي يتم الوصول إليه بواسطة الهاتف المحمول حيث أن العميل 5060 افتراضيًا ، وهو يختلف عن الاثنين ؛ 3. يجب أن يكون اسم ملف التعريف في unimrcpserver-mrcp-v2.xml هو نفسه مثل tts-tts-profile في unimrcp.conf.xml و arm-ars-profile (بعض المستندات تقول أن اسم ملف XML في mrcp_profiles يجب أن يكون متسقًا أيضًا مع هذين الاثنين ، وهو في الواقع غير مؤلف).
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 >أضف البرنامج النصي. lua في دليل/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 ()نحتاج إلى إضافة ملف بناء جملة Hello.gram إلى دليل/usr/local/freeswitch/القواعد. يمكن أن يكون فارغا. يجب أن تفي بمعيار بناء جملة التعرف على الكلام 1.0 (يشار إليه باسم SRGS1.0 لفترة قصيرة). يمكن استخدام محرك ملف بناء الجملة هذا عند التعرف عليه.
<? 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 ، و "التحدث" خدمة TTS. واجهت مشاكل أثناء بدء التشغيل.
قم بتنزيل أداة الاختبار: عميل Adore SIP
ابحث عن "عميل Adore SIP" في متجر التطبيقات (لأنظمة الهاتف المحمول الأخرى ، يرجى الانتقال إلى سوق التطبيقات المقابلة) وتنزيله.

من بينها ، SIP IP هو IP المضيف والمنفذ الذي يمكّنه خدمة Freeswitch (الافتراضي هو 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٪BC٪E5٪85٪A5.html