Browse Source

修改snowboy_wakeup唤醒代码,增加按键唤醒功能

corvin 5 years ago
parent
commit
ecafdf6e04

+ 14 - 41
catkin_ws/src/snowboy_wakeup/CMakeLists.txt

@@ -7,22 +7,14 @@ find_package(catkin REQUIRED COMPONENTS
     dynamic_reconfigure
 )
 
-set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS}")
+set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
 set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules)
 
 find_package(BLAS)
 
-# ------------------------------------------------------------------------------------------------
-#                                     ROS MESSAGES AND SERVICES
-# ------------------------------------------------------------------------------------------------
-
-# Generate services
-# add_service_files(
-#    FILES
-#    service1.srv
-#    ...
-# )
-
+# ------------------------------------------------------
+#               ROS MESSAGES AND SERVICES
+# ------------------------------------------------------
 # Generate added messages and services with any dependencies listed here
 # generate_messages(
 #    DEPENDENCIES
@@ -31,14 +23,13 @@ find_package(BLAS)
 # )
 
 #add dynamic reconfigure api
-#find_package(catkin REQUIRED dynamic_reconfigure)
 generate_dynamic_reconfigure_options(
     cfg/SnowboyReconfigure.cfg
 )
 
-# ------------------------------------------------------------------------------------------------
-#                                          CATKIN EXPORT
-# ------------------------------------------------------------------------------------------------
+# --------------------------------------------------------
+#                    CATKIN EXPORT
+# --------------------------------------------------------
 catkin_package(
 #  INCLUDE_DIRS include
 #  LIBRARIES hotword_detector
@@ -46,9 +37,9 @@ catkin_package(
 #  DEPENDS system_lib
 )
 
-# ------------------------------------------------------------------------------------------------
-#                                              BUILD
-# ------------------------------------------------------------------------------------------------
+# ---------------------------------------------------------
+#                        BUILD
+# ---------------------------------------------------------
 include_directories(
     include
     3rdparty
@@ -68,33 +59,15 @@ target_link_libraries(hotword_detector
     ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/snowboy/lib/libsnowboy-detect.a
     ${catkin_LIBRARIES}
     ${BLAS_LIBRARIES}
+    -lwiringPi
 )
 
-add_executable(hotword_detector_node
+add_executable(wakeup_detector
     src/hotword_detector_node.cpp
 )
-target_link_libraries(hotword_detector_node
+target_link_libraries(wakeup_detector
     hotword_detector
     ${catkin_LIBRARIES}
 )
-add_dependencies(hotword_detector_node ${PROJECT_NAME}_gencfg)
-
-install(
-  TARGETS
-  hotword_detector
-  hotword_detector_node
-  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
-  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
-  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
-)
-
-install(
-  DIRECTORY launch/
-  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
-)
-
-install(
-  DIRECTORY resources/
-  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/resources
-)
+add_dependencies(wakeup_detector ${PROJECT_NAME}_gencfg)
 

+ 35 - 19
catkin_ws/src/snowboy_wakeup/launch/snowboy_wakeup.launch

@@ -1,23 +1,39 @@
+<!--
+Copyright: 2016-2019 wwww.corvin.cn ROS小课堂
+Author: corvin
+Description:
+    该启动文件是snowboy唤醒的启动文件,将启动两个节点分别是arduio_capture,
+    用于从麦克风获取音频数据,并将数据发送到指定的话题上.启动的snowboy_wakeup
+    节点就是订阅麦克风数据,取出后然后进行检查音频数据中是否存在指定的唤醒词.
+    当检测到唤醒词就往指定的话题中发送一条唤醒成功的消息.后续的其他流程,可以
+    订阅该唤醒成功的话题,当发现话题中有指定的唤醒成功消息,就可以得知系统被成
+    功唤醒了,这样就可以进行后续的其他语音处理流程了.
+History:
+    20191009:init this file.
+-->
 <launch>
-    <arg name="ASR_Topic" default="/voice_system/asr_topic" />
-    <arg name="AUDIO_Topic" default="/voice_system/audio_data" />
+    <arg name="namespace" default="voice_system" />
+    <arg name="AUDIO_Topic" default="audio_data" />
+    <arg name="WAKEUP_Topic" default="wakeup_topic" />
 
-    <node name="audio_capture" pkg="audio_capture" type="audio_capture" output="screen" required="true">
-        <param name="format" value="wave" />
-        <param name="channels" value="1" />
-        <param name="depth" value="16" />
-        <param name="sample_rate" value="16000" />
+    <group ns="$(arg namespace)">
+        <node pkg="audio_capture" type="audio_capture" name="audio_capture" output="screen" required="true">
+            <param name="format" value="wave" />
+            <param name="channels" value="1" />
+            <param name="depth" value="16" />
+            <param name="sample_rate" value="16000" />
+            <remap from="audio" to="$(arg AUDIO_Topic)" />
+        </node>
 
-        <remap from="audio" to="$(arg AUDIO_Topic)" />
-    </node>
-
-    <node pkg="snowboy_wakeup" type="hotword_detector_node" name="snowboy_wakeup" respawn="true">
-        <param name="resource_filename" value="$(find snowboy_wakeup)/resources/common.res" />
-        <param name="model_filename" value="$(find snowboy_wakeup)/resources/snowboy.umdl $(find snowboy_wakeup)/resources/corvin.pmdl" />
-
-        <param name="sensitivity_str" value="0.7" type="str" />
-        <param name="audio_gain" value="1.0" />
-        <param name="asr_topic" value="$(arg ASR_Topic)" />
-        <param name="audio_topic" value="$(arg AUDIO_Topic)" />
-    </node>
+        <node pkg="snowboy_wakeup" type="wakeup_detector" name="snowboy_wakeup" output="screen" respawn="true">
+            <param name="resource_filename" value="$(find snowboy_wakeup)/resources/common.res" />
+            <param name="model_filename" value="$(find snowboy_wakeup)/resources/snowboy.umdl" />
+            <param name="beep_filename" value="$(find snowboy_wakeup)/resources/ding.wav" />
+            <param name="sensitivity_str" value="0.7" />
+            <param name="audio_gain" value="1.0" />
+            <param name="wakeup_topic" value="$(arg WAKEUP_Topic)" />
+            <param name="audio_topic" value="$(arg AUDIO_Topic)" />
+        </node>
+    </group>
 </launch>
+

+ 1 - 1
catkin_ws/src/snowboy_wakeup/package.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0"?>
 <package>
   <name>snowboy_wakeup</name>
-  <version>0.0.0</version>
+  <version>0.1.0</version>
   <description>snowboy hotword detector</description>
 
   <maintainer email="corvin_zhang@corvin.cn">corvin</maintainer>

+ 34 - 22
catkin_ws/src/snowboy_wakeup/src/hotword_detector_node.cpp

@@ -4,13 +4,18 @@
 #include <audio_common_msgs/AudioData.h>
 #include <dynamic_reconfigure/server.h>
 #include <hotword_detector.h>
+#include <wiringPi.h>
 
+#define BTN_PIN 27
+volatile char btn_click = 0;
 
 namespace snowboy_wakeup
 {
-    //!
+    std::string beep_filename;
+    std::string pre_param = "play -q --multi-threaded ";
+    std::string all_param;
+
     //! \brief The HotwordDetectorNode class Wraps the C++ 11 Snowboy detector in a ROS node
-    //!
     class HotwordDetectorNode
     {
         public:
@@ -33,10 +38,16 @@ namespace snowboy_wakeup
                     return false;
                 }
 
-                std::string asr_topic;
-                if (!nh_p_.getParam("asr_topic", asr_topic))
+                if (!nh_p_.getParam("beep_filename", beep_filename))
+                {
+                    ROS_WARN("Mandatory parameter 'beep_filename' not present on the parameter server");
+                }
+                all_param = pre_param + beep_filename;
+
+                std::string wakeup_topic;
+                if (!nh_p_.getParam("wakeup_topic", wakeup_topic))
                 {
-                    ROS_ERROR("Mandatory parameter 'asr_topic' not present on the parameter server");
+                    ROS_ERROR("Mandatory parameter 'wakeup_topic' not present on the parameter server");
                     return false;
                 }
 
@@ -48,7 +59,7 @@ namespace snowboy_wakeup
                 }
 
                 audio_sub_ = nh_.subscribe(audio_topic, 1000, &HotwordDetectorNode::audioCallback, this);
-                hotword_pub_ = nh_.advertise<std_msgs::Int32>(asr_topic, 1);
+                hotword_pub_ = nh_.advertise<std_msgs::Int32>(wakeup_topic, 1);
 
                 detector_.initialize(resource_filename.c_str(), model_filename.c_str());
                 dynamic_reconfigure_server_.setCallback(boost::bind(&HotwordDetectorNode::reconfigureCallback, this, _1, _2));
@@ -59,38 +70,28 @@ namespace snowboy_wakeup
         private:
             ros::NodeHandle nh_;
 
-            //!
             //! \brief nh_p_ Local nodehandle for parameters
-            //!
             ros::NodeHandle nh_p_;
 
             ros::Subscriber audio_sub_;
             ros::Publisher hotword_pub_;
 
-            //!
             //! \brief dynamic_reconfigure_server_ In order to online tune the sensitivity and audio gain
-            //!
             dynamic_reconfigure::Server<SnowboyReconfigureConfig> dynamic_reconfigure_server_;
 
-            //!
             //! \brief detector_ C++ 11 Wrapped Snowboy detect
-            //!
             HotwordDetector detector_;
 
-            //!
             //! \brief reconfigureCallback Reconfigure update for sensitiviy and audio level
             //! \param cfg The updated config
-            //!
             void reconfigureCallback(SnowboyReconfigureConfig cfg, uint32_t)
             {
                 detector_.configure(cfg.sensitivity, cfg.audio_gain);
-                ROS_INFO("SnowboyROS (Re)Configured");
+                ROS_INFO("SnowboyROS ReConfigured callback init");
             }
 
-            //!
             //! \brief audioCallback Audio stream callback
             //! \param msg The audo data
-            //!
             void audioCallback(const audio_common_msgs::AudioDataConstPtr& msg)
             {
                 if (msg->data.size() != 0)
@@ -107,13 +108,14 @@ namespace snowboy_wakeup
                     }
 
                     std_msgs::Int32 hotword_msg;
-                    int result = detector_.runDetection( &sample_array[0], msg->data.size()/2);                    
-                    if (result == 1)
+                    int result = detector_.runDetection( &sample_array[0], msg->data.size()/2);
+                    if (result == 1 || btn_click == 1)
                     {
-                        ROS_INFO("Hotword 1 detected!");
-                        hotword_msg.data = result;
+                        btn_click = 0;
+                        ROS_INFO("wakeUp detected!");
+                        hotword_msg.data = 1;
                         hotword_pub_.publish(hotword_msg);
-                        system("play -q --multi-threaded ~/Music/ding.wav");
+                        system(all_param.data());
                     }
                     else if (result == -3)
                     {
@@ -126,7 +128,12 @@ namespace snowboy_wakeup
                 }
             }
     };
+}
 
+//click btn ISR function
+void btnISR()
+{
+    btn_click = 1;
 }
 
 int main(int argc, char** argv)
@@ -134,6 +141,11 @@ int main(int argc, char** argv)
     ros::init(argc, argv, "snowboy_wakeup_node");
     snowboy_wakeup::HotwordDetectorNode ros_hotword_detector_node;
 
+    wiringPiSetup();
+    pinMode(BTN_PIN, INPUT);
+    pullUpDnControl(BTN_PIN, PUD_UP);
+    wiringPiISR(BTN_PIN, INT_EDGE_RISING, &btnISR);
+
     if (ros_hotword_detector_node.initialize())
     {
         ros::spin();