From d930ee5d95f2a3a6f7b7400785e7f6734180c04f Mon Sep 17 00:00:00 2001 From: Elaine Date: Fri, 28 Jul 2017 16:10:58 -0500 Subject: [PATCH 01/36] first stab at dialogue production --- hlpr_dialogue_production/CMakeLists.txt | 193 +++++++++ hlpr_dialogue_production/CMakeLists.txt~ | 192 +++++++++ hlpr_dialogue_production/LICENSE | 27 ++ hlpr_dialogue_production/LICENSE~ | 27 ++ hlpr_dialogue_production/README.md | 4 + .../action/DialogueAct.action | 7 + .../action/DialogueAct.action~ | 5 + .../action/Gesture.action | 5 + .../launch/#all_controllers.launch# | 7 + .../launch/all_controllers.launch | 7 + .../launch/all_controllers.launch~ | 6 + hlpr_dialogue_production/package.xml | 62 +++ hlpr_dialogue_production/package.xml~ | 60 +++ hlpr_dialogue_production/setup.py | 12 + hlpr_dialogue_production/setup.py~ | 12 + .../speech/audio_data/test1.ogg | Bin 0 -> 11323 bytes .../speech/audio_data/test1.wav | Bin 0 -> 86020 bytes .../speech/audio_data/test2.ogg | Bin 0 -> 18090 bytes .../speech/audio_data/test2.wav | Bin 0 -> 116162 bytes .../speech/gen_phrases.sh | 5 + .../speech/gen_phrases.sh~ | 5 + hlpr_dialogue_production/speech/phrases.yaml | 159 ++++++++ hlpr_dialogue_production/speech/script.txt | 2 + .../src/hlpr_dialogue_production/__init__.py | 0 .../hlpr_dialogue_production/controllers.py | 102 +++++ .../hlpr_dialogue_production/controllers.py~ | 93 +++++ .../src/hlpr_dialogue_production/dialogue.py | 373 ++++++++++++++++++ .../src/hlpr_dialogue_production/dialogue.py~ | 373 ++++++++++++++++++ .../gesture_action_server.py | 147 +++++++ .../gesture_action_server.py~ | 174 ++++++++ .../standalone_server.py | 122 ++++++ .../standalone_server.py~ | 121 ++++++ .../test_action_client.py | 44 +++ .../test_action_client.py~ | 49 +++ .../test_action_server.py | 52 +++ .../test_action_server.py~ | 52 +++ 36 files changed, 2499 insertions(+) create mode 100644 hlpr_dialogue_production/CMakeLists.txt create mode 100644 hlpr_dialogue_production/CMakeLists.txt~ create mode 100644 hlpr_dialogue_production/LICENSE create mode 100644 hlpr_dialogue_production/LICENSE~ create mode 100644 hlpr_dialogue_production/README.md create mode 100644 hlpr_dialogue_production/action/DialogueAct.action create mode 100644 hlpr_dialogue_production/action/DialogueAct.action~ create mode 100644 hlpr_dialogue_production/action/Gesture.action create mode 100644 hlpr_dialogue_production/launch/#all_controllers.launch# create mode 100644 hlpr_dialogue_production/launch/all_controllers.launch create mode 100644 hlpr_dialogue_production/launch/all_controllers.launch~ create mode 100644 hlpr_dialogue_production/package.xml create mode 100644 hlpr_dialogue_production/package.xml~ create mode 100644 hlpr_dialogue_production/setup.py create mode 100644 hlpr_dialogue_production/setup.py~ create mode 100644 hlpr_dialogue_production/speech/audio_data/test1.ogg create mode 100644 hlpr_dialogue_production/speech/audio_data/test1.wav create mode 100644 hlpr_dialogue_production/speech/audio_data/test2.ogg create mode 100644 hlpr_dialogue_production/speech/audio_data/test2.wav create mode 100755 hlpr_dialogue_production/speech/gen_phrases.sh create mode 100755 hlpr_dialogue_production/speech/gen_phrases.sh~ create mode 100644 hlpr_dialogue_production/speech/phrases.yaml create mode 100644 hlpr_dialogue_production/speech/script.txt create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/__init__.py create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py~ create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/gesture_action_server.py create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/gesture_action_server.py~ create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py~ create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py~ create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_server.py create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_server.py~ diff --git a/hlpr_dialogue_production/CMakeLists.txt b/hlpr_dialogue_production/CMakeLists.txt new file mode 100644 index 0000000..d4c2a86 --- /dev/null +++ b/hlpr_dialogue_production/CMakeLists.txt @@ -0,0 +1,193 @@ +cmake_minimum_required(VERSION 2.8.3) +project(hlpr_dialogue_production) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + rospy + smach + smach_ros + control_msgs + actionlib + actionlib_msgs +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +# add_service_files( +# FILES +# LookAt.srv +# LookAtT.srv +# LookAtTS.srv +# ) + +## Generate actions in the 'action' folder + add_action_files( + FILES + DialogueAct.action + Gesture.action + ) + +# Generate added messages and services with any dependencies listed here + generate_messages( + DEPENDENCIES + geometry_msgs + actionlib_msgs + std_msgs + ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a run_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES hlpr_lookat +# CATKIN_DEPENDS rospy +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) +include_directories( + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(hlpr_lookat +# src/${PROJECT_NAME}/hlpr_lookat.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(hlpr_lookat ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +# add_executable(hlpr_lookat_node src/hlpr_lookat_node.cpp) + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(hlpr_lookat_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(hlpr_lookat_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS hlpr_lookat hlpr_lookat_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_hlpr_lookat.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/hlpr_dialogue_production/CMakeLists.txt~ b/hlpr_dialogue_production/CMakeLists.txt~ new file mode 100644 index 0000000..57ae5ed --- /dev/null +++ b/hlpr_dialogue_production/CMakeLists.txt~ @@ -0,0 +1,192 @@ +cmake_minimum_required(VERSION 2.8.3) +project(hlpr_dialogue_production) + +## Find catkin macros and libraries +## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) +## is used, also find other catkin packages +find_package(catkin REQUIRED COMPONENTS + rospy + smach + smach_ros + control_msgs + actionlib + actionlib_msgs +) + +## System dependencies are found with CMake's conventions +# find_package(Boost REQUIRED COMPONENTS system) + + +## Uncomment this if the package has a setup.py. This macro ensures +## modules and global scripts declared therein get installed +## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html +catkin_python_setup() + +################################################ +## Declare ROS messages, services and actions ## +################################################ + +## To declare and build messages, services or actions from within this +## package, follow these steps: +## * Let MSG_DEP_SET be the set of packages whose message types you use in +## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). +## * In the file package.xml: +## * add a build_depend tag for "message_generation" +## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET +## * If MSG_DEP_SET isn't empty the following dependency has been pulled in +## but can be declared for certainty nonetheless: +## * add a run_depend tag for "message_runtime" +## * In this file (CMakeLists.txt): +## * add "message_generation" and every package in MSG_DEP_SET to +## find_package(catkin REQUIRED COMPONENTS ...) +## * add "message_runtime" and every package in MSG_DEP_SET to +## catkin_package(CATKIN_DEPENDS ...) +## * uncomment the add_*_files sections below as needed +## and list every .msg/.srv/.action file to be processed +## * uncomment the generate_messages entry below +## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) + +## Generate messages in the 'msg' folder +# add_message_files( +# FILES +# Message1.msg +# Message2.msg +# ) + +# add_service_files( +# FILES +# LookAt.srv +# LookAtT.srv +# LookAtTS.srv +# ) + +## Generate actions in the 'action' folder + add_action_files( + FILES + DialogueAct.action + ) + +# Generate added messages and services with any dependencies listed here + generate_messages( + DEPENDENCIES + geometry_msgs + actionlib_msgs + std_msgs + ) + +################################################ +## Declare ROS dynamic reconfigure parameters ## +################################################ + +## To declare and build dynamic reconfigure parameters within this +## package, follow these steps: +## * In the file package.xml: +## * add a build_depend and a run_depend tag for "dynamic_reconfigure" +## * In this file (CMakeLists.txt): +## * add "dynamic_reconfigure" to +## find_package(catkin REQUIRED COMPONENTS ...) +## * uncomment the "generate_dynamic_reconfigure_options" section below +## and list every .cfg file to be processed + +## Generate dynamic reconfigure parameters in the 'cfg' folder +# generate_dynamic_reconfigure_options( +# cfg/DynReconf1.cfg +# cfg/DynReconf2.cfg +# ) + +################################### +## catkin specific configuration ## +################################### +## The catkin_package macro generates cmake config files for your package +## Declare things to be passed to dependent projects +## INCLUDE_DIRS: uncomment this if you package contains header files +## LIBRARIES: libraries you create in this project that dependent projects also need +## CATKIN_DEPENDS: catkin_packages dependent projects also need +## DEPENDS: system dependencies of this project that dependent projects also need +catkin_package( +# INCLUDE_DIRS include +# LIBRARIES hlpr_lookat +# CATKIN_DEPENDS rospy +# DEPENDS system_lib +) + +########### +## Build ## +########### + +## Specify additional locations of header files +## Your package locations should be listed before other locations +# include_directories(include) +include_directories( + ${catkin_INCLUDE_DIRS} +) + +## Declare a C++ library +# add_library(hlpr_lookat +# src/${PROJECT_NAME}/hlpr_lookat.cpp +# ) + +## Add cmake target dependencies of the library +## as an example, code may need to be generated before libraries +## either from message generation or dynamic reconfigure +# add_dependencies(hlpr_lookat ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Declare a C++ executable +# add_executable(hlpr_lookat_node src/hlpr_lookat_node.cpp) + +## Add cmake target dependencies of the executable +## same as for the library above +# add_dependencies(hlpr_lookat_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) + +## Specify libraries to link a library or executable target against +# target_link_libraries(hlpr_lookat_node +# ${catkin_LIBRARIES} +# ) + +############# +## Install ## +############# + +# all install targets should use catkin DESTINATION variables +# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html + +## Mark executable scripts (Python etc.) for installation +## in contrast to setup.py, you can choose the destination +# install(PROGRAMS +# scripts/my_python_script +# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark executables and/or libraries for installation +# install(TARGETS hlpr_lookat hlpr_lookat_node +# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} +# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +# ) + +## Mark cpp header files for installation +# install(DIRECTORY include/${PROJECT_NAME}/ +# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} +# FILES_MATCHING PATTERN "*.h" +# PATTERN ".svn" EXCLUDE +# ) + +## Mark other files for installation (e.g. launch and bag files, etc.) +# install(FILES +# # myfile1 +# # myfile2 +# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} +# ) + +############# +## Testing ## +############# + +## Add gtest based cpp test target and link libraries +# catkin_add_gtest(${PROJECT_NAME}-test test/test_hlpr_lookat.cpp) +# if(TARGET ${PROJECT_NAME}-test) +# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) +# endif() + +## Add folders to be run by python nosetests +# catkin_add_nosetests(test) diff --git a/hlpr_dialogue_production/LICENSE b/hlpr_dialogue_production/LICENSE new file mode 100644 index 0000000..2511acd --- /dev/null +++ b/hlpr_dialogue_production/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2017, Elaine Short +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of contingency nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/hlpr_dialogue_production/LICENSE~ b/hlpr_dialogue_production/LICENSE~ new file mode 100644 index 0000000..a8ef9ef --- /dev/null +++ b/hlpr_dialogue_production/LICENSE~ @@ -0,0 +1,27 @@ +Copyright (c) 2017, Elaine Short +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of hlpr_lookat nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/hlpr_dialogue_production/README.md b/hlpr_dialogue_production/README.md new file mode 100644 index 0000000..151b350 --- /dev/null +++ b/hlpr_dialogue_production/README.md @@ -0,0 +1,4 @@ +# Contingency Detection Package + +This package detects contingency in behaviors. + diff --git a/hlpr_dialogue_production/action/DialogueAct.action b/hlpr_dialogue_production/action/DialogueAct.action new file mode 100644 index 0000000..e4dabd5 --- /dev/null +++ b/hlpr_dialogue_production/action/DialogueAct.action @@ -0,0 +1,7 @@ +string text_or_key +string audio_file +string behavior_yaml +--- +string outcome +--- +string[] active_states \ No newline at end of file diff --git a/hlpr_dialogue_production/action/DialogueAct.action~ b/hlpr_dialogue_production/action/DialogueAct.action~ new file mode 100644 index 0000000..b41195d --- /dev/null +++ b/hlpr_dialogue_production/action/DialogueAct.action~ @@ -0,0 +1,5 @@ +string text_or_key +string audio_file +string[] + +string[] active_states \ No newline at end of file diff --git a/hlpr_dialogue_production/action/Gesture.action b/hlpr_dialogue_production/action/Gesture.action new file mode 100644 index 0000000..531da63 --- /dev/null +++ b/hlpr_dialogue_production/action/Gesture.action @@ -0,0 +1,5 @@ +string[] poses +--- +bool success +--- +string current_pose \ No newline at end of file diff --git a/hlpr_dialogue_production/launch/#all_controllers.launch# b/hlpr_dialogue_production/launch/#all_controllers.launch# new file mode 100644 index 0000000..a55014f --- /dev/null +++ b/hlpr_dialogue_production/launch/#all_controllers.launch# @@ -0,0 +1,7 @@ +>1;3409;0c + + + + + + \ No newline at end of file diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch new file mode 100644 index 0000000..e3304e0 --- /dev/null +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/hlpr_dialogue_production/launch/all_controllers.launch~ b/hlpr_dialogue_production/launch/all_controllers.launch~ new file mode 100644 index 0000000..3f8e985 --- /dev/null +++ b/hlpr_dialogue_production/launch/all_controllers.launch~ @@ -0,0 +1,6 @@ + + + + + + diff --git a/hlpr_dialogue_production/package.xml b/hlpr_dialogue_production/package.xml new file mode 100644 index 0000000..00acf57 --- /dev/null +++ b/hlpr_dialogue_production/package.xml @@ -0,0 +1,62 @@ + + + hlpr_dialogue_production + 0.0.0 + Speech production with simultaneous behavior for HLP-R robot. + + + + + Elaine Short + + + + + + BSD + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + cordial_tts + hlpr_manipulation_utils + message_generation + control_msgs + message_runtime + rospy + actionlib + actionlib_msgs + smach + smach_ros + hlpr_manipulation_utils + cordial_tts + + + + + + + + diff --git a/hlpr_dialogue_production/package.xml~ b/hlpr_dialogue_production/package.xml~ new file mode 100644 index 0000000..86e6c29 --- /dev/null +++ b/hlpr_dialogue_production/package.xml~ @@ -0,0 +1,60 @@ + + + hlpr_dialogue_production + 0.0.0 + Speech production with simultaneous behavior for HLP-R robot. + + + + + Elaine Short + + + + + + BSD + + + + + + + + + + + + + + + + + + + + + + + + + + catkin + cordial_tts + hlpr_manipulation_utils + control_msgs + rospy + actionlib + actionlib_msgs + smach + smach_ros + hlpr_manipulation_utils + cordial_tts + + + + + + + + diff --git a/hlpr_dialogue_production/setup.py b/hlpr_dialogue_production/setup.py new file mode 100644 index 0000000..bac6e30 --- /dev/null +++ b/hlpr_dialogue_production/setup.py @@ -0,0 +1,12 @@ +## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD + +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +# fetch values from package.xml +setup_args = generate_distutils_setup( + packages=['hlpr_dialogue_production'], + package_dir={'': 'src'}, +) + +setup(**setup_args) diff --git a/hlpr_dialogue_production/setup.py~ b/hlpr_dialogue_production/setup.py~ new file mode 100644 index 0000000..4a85f18 --- /dev/null +++ b/hlpr_dialogue_production/setup.py~ @@ -0,0 +1,12 @@ +## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD + +from distutils.core import setup +from catkin_pkg.python_setup import generate_distutils_setup + +# fetch values from package.xml +setup_args = generate_distutils_setup( + packages=['cordial_tts'], + package_dir={'': 'src'}, +) + +setup(**setup_args) diff --git a/hlpr_dialogue_production/speech/audio_data/test1.ogg b/hlpr_dialogue_production/speech/audio_data/test1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5ea69a051067b2ea2f9b889b0e42abed3cef0a60 GIT binary patch literal 11323 zcmch7cT`hPx9ABq^w4{+p$UR?6aor_9;6tgNbdqck*1+b5fMTWsR}|s6p*eUy-1a+ zbfkj_h!jEK9`yU&?|pZ@b=Ujr&6-U1IeTW$?t5}h44s`#00Q8DG&2XGYzP+@X1M|dYEVvzTRfW||mj!T^^_F8ogv54-_!9-Kw zd_g{kxsk7q#7ZXS1&evF&ngcHE%7+_`j82NP=ex0l5c|aUo5pR{Cr+0gI26hAqxoQ zbAV9MIpir_ljPg42tvy|(J0^7m(H;)&eXmX=Tth*>1~`-j=xkh@^{{!$$y6UbMk*6 zFXt=6^I_0>!k}Bu(ep`w3QBc@ z7*qxT1?Oo;PW(x&A7s+@oT2kTqu|mA3VxwO2&vI>0zs3yh-VCIF);RzG z)K(<+g+jujMN+|yY|@CRR|EhS0EobOlv?Es`a1#xKU4;G|7ZWZEe`+yVImGJg#VZT z%FD*8k%gkWNzR1epw-|+^lRV?!sp`Y7-s0p$*_VldGwUt+Q^ts2Y3yiteS$4hsx{CnX4 zqXtl57zwLGBFJC_!ylr)AU%%1Vu8qW@8-CQ643G$&`J{MP7>EiR_S?r-t|W`^%+e^ zO+Cl=J#F?qXGa}p_Z=rk9j#Iwr>i`z#;mNy@BC-~BRZA{z$Pq$S_iv!LcTWnALArK z02qLMp%A;E4ca3?@J5o5YpQcVYGFV|Q4H6gDWG9Mt$_{u{EyiLZlu0+%`QAQc5!j+ zOMG#$TgFS*|Gg9B@s8 zn$M6t5>%9Kr>C@uN07it>!Ojo1-ZjB7YhE8u0}3f!n680@cjD}|;Y*pm28x~OelXD$7C&laKF&8m zu`m-ucaby&LyZv10?h!Bf**>!!9+%gS|)g%h>4Yk(%QoiWbjBMRB>kVkh%^&JPD

yFPeFrVP9^GSyBD-~QRI=TcQV1|-E`KLGE@ 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 SCReLIK(^>E2&^n$p#Co)v)qON literal 0 HcmV?d00001 diff --git a/hlpr_dialogue_production/speech/audio_data/test1.wav b/hlpr_dialogue_production/speech/audio_data/test1.wav new file mode 100644 index 0000000000000000000000000000000000000000..9f1f47865e8b48ad2c5cd9a9b29af331cd91bc0f GIT binary patch literal 86020 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 b_rAh=M*cg-!e_ literal 0 HcmV?d00001 diff --git a/hlpr_dialogue_production/speech/gen_phrases.sh b/hlpr_dialogue_production/speech/gen_phrases.sh new file mode 100755 index 0000000..49ba659 --- /dev/null +++ b/hlpr_dialogue_production/speech/gen_phrases.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +mkdir audio_data +rosrun cordial_tts gen_phrases.py -o phrases.yaml -d ./audio_data -v Kendra script.txt +oggdec audio_data/*.ogg diff --git a/hlpr_dialogue_production/speech/gen_phrases.sh~ b/hlpr_dialogue_production/speech/gen_phrases.sh~ new file mode 100755 index 0000000..00bf9f1 --- /dev/null +++ b/hlpr_dialogue_production/speech/gen_phrases.sh~ @@ -0,0 +1,5 @@ +#!/usr/bin/sh + +mkdir audio_data +rosrun cordial_tts gen_phrases.py -o phrases.yaml -d ./audio_data -v Kendra script.txt +oggdec audio_data/* diff --git a/hlpr_dialogue_production/speech/phrases.yaml b/hlpr_dialogue_production/speech/phrases.yaml new file mode 100644 index 0000000..08198a2 --- /dev/null +++ b/hlpr_dialogue_production/speech/phrases.yaml @@ -0,0 +1,159 @@ +# Auto-generated phrase file for the dragonbot +# Generated from files: -d ./audio_data -v Kendra script.txt + +test1: + behaviors: + - args: [] + id: test + start: 1.152 + type: action + - id: AA_AH + start: 0.006 + type: viseme + - id: AA_AH + start: 0.133 + type: viseme + - id: N_NG_D_Z + start: 0.164 + type: viseme + - id: AO_AW + start: 0.279 + type: viseme + - id: N_NG_D_Z + start: 0.389 + type: viseme + - id: EH_AE_AY + start: 0.461 + type: viseme + - id: R_ER + start: 0.587 + type: viseme + - id: IDLE + start: 0.759 + type: viseme + - id: AA_AH + start: 1.152 + type: viseme + - id: AA_AH + start: 1.2 + type: viseme + - id: AA_AH + start: 1.37 + type: viseme + - id: R_ER + start: 1.489 + type: viseme + - id: EY + start: 1.561 + type: viseme + - id: AO_AW + start: 1.729 + type: viseme + - id: IDLE + start: 1.942 + type: viseme + file: /home/eshort/code/sandbox/hlpr_dialogue_production/speech/audio_data/test1.wav + text: '"Hello there! How are you?"' +test2: + behaviors: + - args: [] + id: test + start: 0.006 + type: action + - args: [] + id: test + start: 1.229 + type: action + - args: [] + id: test + start: 1.995 + type: action + - id: N_NG_D_Z + start: 0.006 + type: viseme + - id: EY + start: 0.069 + type: viseme + - id: N_NG_D_Z + start: 0.145 + type: viseme + - id: M_B_P + start: 0.266 + type: viseme + - id: R_ER + start: 0.373 + type: viseme + - id: EY + start: 0.442 + type: viseme + - id: N_NG_D_Z + start: 0.567 + type: viseme + - id: N_NG_D_Z + start: 0.658 + type: viseme + - id: EH_AE_AY + start: 0.744 + type: viseme + - id: N_NG_D_Z + start: 0.842 + type: viseme + - id: N_NG_D_Z + start: 0.946 + type: viseme + - id: N_NG_D_Z + start: 1.008 + type: viseme + - id: N_NG_D_Z + start: 1.128 + type: viseme + - id: AA_AH + start: 1.189 + type: viseme + - id: N_NG_D_Z + start: 1.229 + type: viseme + - id: AA_AH + start: 1.344 + type: viseme + - id: M_B_P + start: 1.503 + type: viseme + - id: EY + start: 1.567 + type: viseme + - id: AA_AH + start: 1.597 + type: viseme + - id: AA_AH + start: 1.705 + type: viseme + - id: M_B_P + start: 1.757 + type: viseme + - id: N_NG_D_Z + start: 1.821 + type: viseme + - id: EY + start: 1.891 + type: viseme + - id: AA_AH + start: 1.995 + type: viseme + - id: AA_AH + start: 2.123 + type: viseme + - id: CH_SH_ZH + start: 2.188 + type: viseme + - id: N_NG_D_Z + start: 2.285 + type: viseme + - id: N_NG_D_Z + start: 2.482 + type: viseme + - id: IDLE + start: 2.626 + type: viseme + file: /home/eshort/code/sandbox/hlpr_dialogue_production/speech/audio_data/test2.wav + text: '"This phrase tests the timing of the actions."' diff --git a/hlpr_dialogue_production/speech/script.txt b/hlpr_dialogue_production/speech/script.txt new file mode 100644 index 0000000..a0cef2c --- /dev/null +++ b/hlpr_dialogue_production/speech/script.txt @@ -0,0 +1,2 @@ +[test1] Hello there! How are you? +[test2] This phrase tests the timing of the actions. diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/__init__.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py new file mode 100644 index 0000000..3c5353a --- /dev/null +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python + +# Copyright (c) 2017, Elaine Short, SIM Lab +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the SIM Lab nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import rospy +import smach +import smach_ros +import actionlib +import random + +from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion +from std_msgs.msg import Header +import hlpr_dialogue_production.msg as dialogue_msgs + + +from hlpr_dialogue_production.dialogue import ControllerState +import hlpr_lookat.msg + + +import actionlib_tutorials.msg + + +def lookat_controller_cb(behavior_name, string_args): + if len(string_args)==1: #have just a frame name + vec3=Vector3(0.0,0.0,0.0) + elif len(string_args)==4: + point = map(lambda s: float(s), string_args[1:]) + vec3=Vector3(point[0],point[1],point[2]) + else: + rospy.logerr("Invalid arguments to lookat: {}".format(string_args)) + return None + + frame = string_args[0] + + pos = TransformStamped() + pos.child_frame_id = frame + pos.transform = Transform() + pos.transform.translation = vec3 + pos.header = Header() + waypoints = [pos] + waytimes = [rospy.Duration(0.0)] + return hlpr_lookat.msg.LookatWaypointsGoal(waypoints,waytimes) + +def get_lookat_controller(): + behaviors=["lookat"] + time_adj = None + return ControllerState("LOOKAT_CONTROLLER",behaviors, + "/lookat_waypoints_action_server", + hlpr_lookat.msg.LookatWaypointsAction, + lookat_controller_cb,time_adj) + +def gesture_controller_cb(behavior_name, string_args): + gesture_poses = {"wave":["wave1","wave2","wave1","wave2"], + "shrug":["right_home","shrug","right_home"], + "thinking":["right_home","hmm","right_home"]} + return dialogue_msgs.GestureGoal(poses=gesture_poses[behavior_name]) + +def get_gesture_controller(): + behaviors=["wave", "shrug", "thinking"] + time_adj = {"wave":1.0, + "shrug":1.0, + "thinking":1.0} + + return ControllerState("GESTURE_CONTROLLER", behaviors, "/HLPR_Gesture", + dialogue_msgs.GestureAction, + gesture_controller_cb, time_adj) + +def test_controller_cb(behavior_name, string_args): + return actionlib_tutorials.msg.FibonacciGoal(order=20) + +def get_test_controller(): + behaviors=["test"] + time_adj = {"test":0.0} + return ControllerState("TEST_CONTROLLER",behaviors,"/test_beep_controller", + actionlib_tutorials.msg.FibonacciAction, + test_controller_cb, time_adj) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ new file mode 100644 index 0000000..68cfac2 --- /dev/null +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ @@ -0,0 +1,93 @@ +#!/usr/bin/env python + +# Copyright (c) 2017, Elaine Short, SIM Lab +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the SIM Lab nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import rospy +import smach +import smach_ros +import actionlib +import random + +from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion +from std_msgs.msg import Header + + +from hlpr_dialogue_production.dialogue import ControllerState +import hlpr_lookat.msg + + +import actionlib_tutorials.msg + + +def lookat_controller_cb(string_args): + print string_args + if len(string_args)==1: #have just a frame name + vec3=Vector3(0.0,0.0,0.0) + elif len(string_args)==4: + point = map(lambda s: float(s), string_args[1:]) + vec3=Vector3(point[0],point[1],point[2]) + else: + rospy.logerr("Invalid arguments to lookat: {}".format(string_args)) + return None + + frame = string_args[0] + + pos = TransformStamped() + pos.child_frame_id = frame + pos.transform = Transform() + pos.transform.translation = vec3 + pos.header = Header() + waypoints = [pos] + waytimes = [rospy.Duration(0.0)] + return hlpr_lookat.msg.LookatWaypointsGoal(waypoints,waytimes) + +def get_lookat_controller(): + behaviors=["lookat"] + time_adj = None + return ControllerState("LOOKAT_CONTROLLER",behaviors, + "/lookat_waypoints_action_server", + hlpr_lookat.msg.LookatWaypointsAction, + lookat_controller_cb,time_adj) + +def gesture_controller_cb(string_args): + behaviors=["wave"] + return "" + +def get_gesture_controller(): + pass + +def test_controller_cb(string_args): + return actionlib_tutorials.msg.FibonacciGoal(order=20) + +def get_test_controller(): + behaviors=["test"] + time_adj = {"test":0.0} + return ControllerState("TEST_CONTROLLER",behaviors,"/test_beep_controller", + actionlib_tutorials.msg.FibonacciAction, + test_controller_cb, time_adj) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py new file mode 100644 index 0000000..bb8e8c8 --- /dev/null +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -0,0 +1,373 @@ +#!/usr/bin/env python + +# Copyright (c) 2017, Elaine Short, SIM Lab +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the SIM Lab nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import rospy +import smach +import smach_ros +import wave +import yaml +import threading +import actionlib +import contextlib +from sound_play.libsoundplay import SoundClient +from cordial_tts.cordial_tts import CoRDialTTS + +class Synchronizer(): + def __init__(self): + self.started = False + self.time = None + + def start(self): + self.started = True + self.time = rospy.Time.now() + + def reset(self): + self.started = False + self.time = None + +class ControllerState(smach.State): + def __init__(self, name, behaviors, topic, action_type, arg_list_to_goal_cb, behavior_time_adj=None): + smach.State.__init__(self,outcomes=["preempted","done"], + input_keys=["ordered_behaviors"]) + self.name = name + self._can_handle = behaviors + self._cb = arg_list_to_goal_cb + self._client = actionlib.SimpleActionClient(topic,action_type) + self._sync = None + if behavior_time_adj!=None: + self._time_adj = behavior_time_adj + else: + self._time_adj = {} + + def setup_sync(self,synchronizer): + self._sync=synchronizer + + def execute(self,userdata): + ordered_behaviors = filter(lambda b: b["id"] in self._can_handle, + userdata.ordered_behaviors) + + while not (self._sync!=None and self._sync.started) and not self.preempt_requested(): + rospy.sleep(0.001) + + if self.preempt_requested(): + self._client.cancel_all_goals() + self.service_preempt() + return "preempted" + + goal_sent=False + for b in ordered_behaviors: + if b["id"] in self._time_adj: + start = b["start"]-self._time_adj[b["id"]] + else: + start = b["start"] + + goal = self._cb(b["id"],b["args"]) + if goal==None: + continue + while rospy.Time.now()-self._sync.time < rospy.Duration.from_sec(start) and not self.preempt_requested(): + rospy.sleep(0.001) + + if self.preempt_requested(): + self._client.cancel_all_goals() + self.service_preempt() + return "preempted" + + self._client.send_goal(goal) + goal_sent = True + if goal_sent: + while not self._client.wait_for_result(rospy.Duration(0.05)): + if self.preempt_requested(): + self._client.cancel_all_goals() + self.service_preempt() + return "preempted" + return "done" + +class TTSSpeechStart(smach.State): + def __init__(self,voice="Kimberly"): + smach.State.__init__(self,outcomes=["done"], + input_keys=["marked_text"], + output_keys=["text","ordered_behaviors","wav_file"]) + self._tts = CoRDialTTS(voice) + + def execute(self,userdata): + text, behaviors = self._tts.extract_behaviors(userdata.marked_text) + wav_file = None + userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) + userdata.text = text + userdata.wav_file = wav_file + return "done" + +class TTSFallbackSpeechStart(smach.State): + def __init__(self, phrases, voice="Kimberly"): + smach.State.__init__(self,outcomes=["done"], + input_keys=["key_or_marked_text"], + output_keys=["text","ordered_behaviors","wav_file"]) + self._tts = CoRDialTTS(voice) + self._phrases = phrases + + def execute(self,userdata): + if userdata.key_or_marked_text in self._phrases: + phrase = self._phrases[userdata.key_or_marked_text] + if "text" in phrase: + text = phrase["text"] + else: + text = None + wav_file = phrase["file"] + behaviors = phrase["behaviors"] + else: + text, behaviors = self._tts.extract_behaviors(userdata.key_or_marked_text) + wav_file = None + + userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) + userdata.text = text + userdata.wav_file = wav_file + return "done" + +class FileSpeechStart(smach.State): + def __init__(self, phrases): + smach.State.__init__(self,outcomes=["done","not_found"], + input_keys=["key"], + output_keys=["text","ordered_behaviors","wav_file"]) + self._phrases = phrases + + def execute(self,userdata): + if userdata.key not in self._phrases: + return "not_found" + phrase = self._phrases[userdata.key] + if "text" in phrase: + text = phrase["text"] + else: + text = None + wav_file = phrase["file"] + behaviors = phrase["behaviors"] + + userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) + userdata.text = text + userdata.wav_file = wav_file + return "done" + +class NoPrepSpeechStart(smach.State): + def __init__(self): + smach.State.__init__(self,outcomes=["done","missing_info"], + input_keys=["behaviors","wav_file_loc"], + output_keys=["text","ordered_behaviors","wav_file"]) + + def execute(self,userdata): + if userdata.behaviors==None: + return "missing_info" + if userdata.wav_file==None: + return "missing_info" + behaviors = userdata.behaviors + text = None + wav_file = userdata.wav_file + + userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) + userdata.text = text + userdata.wav_file = wav_file + return "done" + + + +class SpeechState(smach.State): + def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): + smach.State.__init__(self,outcomes=["preempted","no_audio","done"], + input_keys=["text","wav_file"]) + self._tts = use_tts + if use_tts: + self._talker = CoRDialTTS(voice) + self._sound_client = SoundClient() + self._sync = synchronizer + + def execute(self,userdata): + rospy.loginfo("Saying: {}".format(userdata.text)) + if userdata.wav_file==None: + if userdata.text!=None and len(userdata.text)!=0: + speech_duration = self._talker.say(userdata.text,wait=False) + self._sync.start() + else: + return "no_audio" + else: + wav_file = userdata.wav_file + with contextlib.closing(wave.open(wav_file,'r')) as f: + frames=f.getnframes() + rate=f.getframerate() + speech_duration=frames/float(rate) + self._sound_client.playWave(wav_file) + self._sync.start() + + while rospy.Time.now()-self._sync.time Date: Fri, 28 Jul 2017 16:12:26 -0500 Subject: [PATCH 02/36] removing temporary files --- hlpr_dialogue_production/CMakeLists.txt~ | 192 --------- hlpr_dialogue_production/LICENSE~ | 27 -- .../action/DialogueAct.action~ | 5 - .../launch/#all_controllers.launch# | 7 - .../launch/all_controllers.launch~ | 6 - hlpr_dialogue_production/package.xml~ | 60 --- hlpr_dialogue_production/setup.py~ | 12 - .../speech/audio_data/test1.ogg | Bin 11323 -> 0 bytes .../speech/audio_data/test1.wav | Bin 86020 -> 0 bytes .../speech/audio_data/test2.ogg | Bin 18090 -> 0 bytes .../speech/audio_data/test2.wav | Bin 116162 -> 0 bytes .../speech/gen_phrases.sh~ | 5 - hlpr_dialogue_production/speech/phrases.yaml | 159 -------- .../hlpr_dialogue_production/controllers.py~ | 93 ----- .../src/hlpr_dialogue_production/dialogue.py~ | 373 ------------------ .../gesture_action_server.py~ | 174 -------- .../standalone_server.py~ | 121 ------ .../test_action_client.py~ | 49 --- .../test_action_server.py~ | 52 --- 19 files changed, 1335 deletions(-) delete mode 100644 hlpr_dialogue_production/CMakeLists.txt~ delete mode 100644 hlpr_dialogue_production/LICENSE~ delete mode 100644 hlpr_dialogue_production/action/DialogueAct.action~ delete mode 100644 hlpr_dialogue_production/launch/#all_controllers.launch# delete mode 100644 hlpr_dialogue_production/launch/all_controllers.launch~ delete mode 100644 hlpr_dialogue_production/package.xml~ delete mode 100644 hlpr_dialogue_production/setup.py~ delete mode 100644 hlpr_dialogue_production/speech/audio_data/test1.ogg delete mode 100644 hlpr_dialogue_production/speech/audio_data/test1.wav delete mode 100644 hlpr_dialogue_production/speech/audio_data/test2.ogg delete mode 100644 hlpr_dialogue_production/speech/audio_data/test2.wav delete mode 100755 hlpr_dialogue_production/speech/gen_phrases.sh~ delete mode 100644 hlpr_dialogue_production/speech/phrases.yaml delete mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ delete mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py~ delete mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/gesture_action_server.py~ delete mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py~ delete mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py~ delete mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_server.py~ diff --git a/hlpr_dialogue_production/CMakeLists.txt~ b/hlpr_dialogue_production/CMakeLists.txt~ deleted file mode 100644 index 57ae5ed..0000000 --- a/hlpr_dialogue_production/CMakeLists.txt~ +++ /dev/null @@ -1,192 +0,0 @@ -cmake_minimum_required(VERSION 2.8.3) -project(hlpr_dialogue_production) - -## Find catkin macros and libraries -## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) -## is used, also find other catkin packages -find_package(catkin REQUIRED COMPONENTS - rospy - smach - smach_ros - control_msgs - actionlib - actionlib_msgs -) - -## System dependencies are found with CMake's conventions -# find_package(Boost REQUIRED COMPONENTS system) - - -## Uncomment this if the package has a setup.py. This macro ensures -## modules and global scripts declared therein get installed -## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html -catkin_python_setup() - -################################################ -## Declare ROS messages, services and actions ## -################################################ - -## To declare and build messages, services or actions from within this -## package, follow these steps: -## * Let MSG_DEP_SET be the set of packages whose message types you use in -## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). -## * In the file package.xml: -## * add a build_depend tag for "message_generation" -## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET -## * If MSG_DEP_SET isn't empty the following dependency has been pulled in -## but can be declared for certainty nonetheless: -## * add a run_depend tag for "message_runtime" -## * In this file (CMakeLists.txt): -## * add "message_generation" and every package in MSG_DEP_SET to -## find_package(catkin REQUIRED COMPONENTS ...) -## * add "message_runtime" and every package in MSG_DEP_SET to -## catkin_package(CATKIN_DEPENDS ...) -## * uncomment the add_*_files sections below as needed -## and list every .msg/.srv/.action file to be processed -## * uncomment the generate_messages entry below -## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) - -## Generate messages in the 'msg' folder -# add_message_files( -# FILES -# Message1.msg -# Message2.msg -# ) - -# add_service_files( -# FILES -# LookAt.srv -# LookAtT.srv -# LookAtTS.srv -# ) - -## Generate actions in the 'action' folder - add_action_files( - FILES - DialogueAct.action - ) - -# Generate added messages and services with any dependencies listed here - generate_messages( - DEPENDENCIES - geometry_msgs - actionlib_msgs - std_msgs - ) - -################################################ -## Declare ROS dynamic reconfigure parameters ## -################################################ - -## To declare and build dynamic reconfigure parameters within this -## package, follow these steps: -## * In the file package.xml: -## * add a build_depend and a run_depend tag for "dynamic_reconfigure" -## * In this file (CMakeLists.txt): -## * add "dynamic_reconfigure" to -## find_package(catkin REQUIRED COMPONENTS ...) -## * uncomment the "generate_dynamic_reconfigure_options" section below -## and list every .cfg file to be processed - -## Generate dynamic reconfigure parameters in the 'cfg' folder -# generate_dynamic_reconfigure_options( -# cfg/DynReconf1.cfg -# cfg/DynReconf2.cfg -# ) - -################################### -## catkin specific configuration ## -################################### -## The catkin_package macro generates cmake config files for your package -## Declare things to be passed to dependent projects -## INCLUDE_DIRS: uncomment this if you package contains header files -## LIBRARIES: libraries you create in this project that dependent projects also need -## CATKIN_DEPENDS: catkin_packages dependent projects also need -## DEPENDS: system dependencies of this project that dependent projects also need -catkin_package( -# INCLUDE_DIRS include -# LIBRARIES hlpr_lookat -# CATKIN_DEPENDS rospy -# DEPENDS system_lib -) - -########### -## Build ## -########### - -## Specify additional locations of header files -## Your package locations should be listed before other locations -# include_directories(include) -include_directories( - ${catkin_INCLUDE_DIRS} -) - -## Declare a C++ library -# add_library(hlpr_lookat -# src/${PROJECT_NAME}/hlpr_lookat.cpp -# ) - -## Add cmake target dependencies of the library -## as an example, code may need to be generated before libraries -## either from message generation or dynamic reconfigure -# add_dependencies(hlpr_lookat ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Declare a C++ executable -# add_executable(hlpr_lookat_node src/hlpr_lookat_node.cpp) - -## Add cmake target dependencies of the executable -## same as for the library above -# add_dependencies(hlpr_lookat_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) - -## Specify libraries to link a library or executable target against -# target_link_libraries(hlpr_lookat_node -# ${catkin_LIBRARIES} -# ) - -############# -## Install ## -############# - -# all install targets should use catkin DESTINATION variables -# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html - -## Mark executable scripts (Python etc.) for installation -## in contrast to setup.py, you can choose the destination -# install(PROGRAMS -# scripts/my_python_script -# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark executables and/or libraries for installation -# install(TARGETS hlpr_lookat hlpr_lookat_node -# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} -# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} -# ) - -## Mark cpp header files for installation -# install(DIRECTORY include/${PROJECT_NAME}/ -# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} -# FILES_MATCHING PATTERN "*.h" -# PATTERN ".svn" EXCLUDE -# ) - -## Mark other files for installation (e.g. launch and bag files, etc.) -# install(FILES -# # myfile1 -# # myfile2 -# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} -# ) - -############# -## Testing ## -############# - -## Add gtest based cpp test target and link libraries -# catkin_add_gtest(${PROJECT_NAME}-test test/test_hlpr_lookat.cpp) -# if(TARGET ${PROJECT_NAME}-test) -# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) -# endif() - -## Add folders to be run by python nosetests -# catkin_add_nosetests(test) diff --git a/hlpr_dialogue_production/LICENSE~ b/hlpr_dialogue_production/LICENSE~ deleted file mode 100644 index a8ef9ef..0000000 --- a/hlpr_dialogue_production/LICENSE~ +++ /dev/null @@ -1,27 +0,0 @@ -Copyright (c) 2017, Elaine Short -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -* Neither the name of hlpr_lookat nor the names of its - contributors may be used to endorse or promote products derived from - this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/hlpr_dialogue_production/action/DialogueAct.action~ b/hlpr_dialogue_production/action/DialogueAct.action~ deleted file mode 100644 index b41195d..0000000 --- a/hlpr_dialogue_production/action/DialogueAct.action~ +++ /dev/null @@ -1,5 +0,0 @@ -string text_or_key -string audio_file -string[] - -string[] active_states \ No newline at end of file diff --git a/hlpr_dialogue_production/launch/#all_controllers.launch# b/hlpr_dialogue_production/launch/#all_controllers.launch# deleted file mode 100644 index a55014f..0000000 --- a/hlpr_dialogue_production/launch/#all_controllers.launch# +++ /dev/null @@ -1,7 +0,0 @@ ->1;3409;0c - - - - - - \ No newline at end of file diff --git a/hlpr_dialogue_production/launch/all_controllers.launch~ b/hlpr_dialogue_production/launch/all_controllers.launch~ deleted file mode 100644 index 3f8e985..0000000 --- a/hlpr_dialogue_production/launch/all_controllers.launch~ +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/hlpr_dialogue_production/package.xml~ b/hlpr_dialogue_production/package.xml~ deleted file mode 100644 index 86e6c29..0000000 --- a/hlpr_dialogue_production/package.xml~ +++ /dev/null @@ -1,60 +0,0 @@ - - - hlpr_dialogue_production - 0.0.0 - Speech production with simultaneous behavior for HLP-R robot. - - - - - Elaine Short - - - - - - BSD - - - - - - - - - - - - - - - - - - - - - - - - - - catkin - cordial_tts - hlpr_manipulation_utils - control_msgs - rospy - actionlib - actionlib_msgs - smach - smach_ros - hlpr_manipulation_utils - cordial_tts - - - - - - - - diff --git a/hlpr_dialogue_production/setup.py~ b/hlpr_dialogue_production/setup.py~ deleted file mode 100644 index 4a85f18..0000000 --- a/hlpr_dialogue_production/setup.py~ +++ /dev/null @@ -1,12 +0,0 @@ -## ! DO NOT MANUALLY INVOKE THIS setup.py, USE CATKIN INSTEAD - -from distutils.core import setup -from catkin_pkg.python_setup import generate_distutils_setup - -# fetch values from package.xml -setup_args = generate_distutils_setup( - packages=['cordial_tts'], - package_dir={'': 'src'}, -) - -setup(**setup_args) diff --git a/hlpr_dialogue_production/speech/audio_data/test1.ogg b/hlpr_dialogue_production/speech/audio_data/test1.ogg deleted file mode 100644 index 5ea69a051067b2ea2f9b889b0e42abed3cef0a60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11323 zcmch7cT`hPx9ABq^w4{+p$UR?6aor_9;6tgNbdqck*1+b5fMTWsR}|s6p*eUy-1a+ zbfkj_h!jEK9`yU&?|pZ@b=Ujr&6-U1IeTW$?t5}h44s`#00Q8DG&2XGYzP+@X1M|dYEVvzTRfW||mj!T^^_F8ogv54-_!9-Kw zd_g{kxsk7q#7ZXS1&evF&ngcHE%7+_`j82NP=ex0l5c|aUo5pR{Cr+0gI26hAqxoQ zbAV9MIpir_ljPg42tvy|(J0^7m(H;)&eXmX=Tth*>1~`-j=xkh@^{{!$$y6UbMk*6 zFXt=6^I_0>!k}Bu(ep`w3QBc@ z7*qxT1?Oo;PW(x&A7s+@oT2kTqu|mA3VxwO2&vI>0zs3yh-VCIF);RzG z)K(<+g+jujMN+|yY|@CRR|EhS0EobOlv?Es`a1#xKU4;G|7ZWZEe`+yVImGJg#VZT z%FD*8k%gkWNzR1epw-|+^lRV?!sp`Y7-s0p$*_VldGwUt+Q^ts2Y3yiteS$4hsx{CnX4 zqXtl57zwLGBFJC_!ylr)AU%%1Vu8qW@8-CQ643G$&`J{MP7>EiR_S?r-t|W`^%+e^ zO+Cl=J#F?qXGa}p_Z=rk9j#Iwr>i`z#;mNy@BC-~BRZA{z$Pq$S_iv!LcTWnALArK z02qLMp%A;E4ca3?@J5o5YpQcVYGFV|Q4H6gDWG9Mt$_{u{EyiLZlu0+%`QAQc5!j+ zOMG#$TgFS*|Gg9B@s8 zn$M6t5>%9Kr>C@uN07it>!Ojo1-ZjB7YhE8u0}3f!n680@cjD}|;Y*pm28x~OelXD$7C&laKF&8m zu`m-ucaby&LyZv10?h!Bf**>!!9+%gS|)g%h>4Yk(%QoiWbjBMRB>kVkh%^&JPD

yFPeFrVP9^GSyBD-~QRI=TcQV1|-E`KLGE@ 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 SCReLIK(^>E2&^n$p#Co)v)qON diff --git a/hlpr_dialogue_production/speech/audio_data/test1.wav b/hlpr_dialogue_production/speech/audio_data/test1.wav deleted file mode 100644 index 9f1f47865e8b48ad2c5cd9a9b29af331cd91bc0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86020 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 b_rAh=M*cg-!e_ diff --git a/hlpr_dialogue_production/speech/gen_phrases.sh~ b/hlpr_dialogue_production/speech/gen_phrases.sh~ deleted file mode 100755 index 00bf9f1..0000000 --- a/hlpr_dialogue_production/speech/gen_phrases.sh~ +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/sh - -mkdir audio_data -rosrun cordial_tts gen_phrases.py -o phrases.yaml -d ./audio_data -v Kendra script.txt -oggdec audio_data/* diff --git a/hlpr_dialogue_production/speech/phrases.yaml b/hlpr_dialogue_production/speech/phrases.yaml deleted file mode 100644 index 08198a2..0000000 --- a/hlpr_dialogue_production/speech/phrases.yaml +++ /dev/null @@ -1,159 +0,0 @@ -# Auto-generated phrase file for the dragonbot -# Generated from files: -d ./audio_data -v Kendra script.txt - -test1: - behaviors: - - args: [] - id: test - start: 1.152 - type: action - - id: AA_AH - start: 0.006 - type: viseme - - id: AA_AH - start: 0.133 - type: viseme - - id: N_NG_D_Z - start: 0.164 - type: viseme - - id: AO_AW - start: 0.279 - type: viseme - - id: N_NG_D_Z - start: 0.389 - type: viseme - - id: EH_AE_AY - start: 0.461 - type: viseme - - id: R_ER - start: 0.587 - type: viseme - - id: IDLE - start: 0.759 - type: viseme - - id: AA_AH - start: 1.152 - type: viseme - - id: AA_AH - start: 1.2 - type: viseme - - id: AA_AH - start: 1.37 - type: viseme - - id: R_ER - start: 1.489 - type: viseme - - id: EY - start: 1.561 - type: viseme - - id: AO_AW - start: 1.729 - type: viseme - - id: IDLE - start: 1.942 - type: viseme - file: /home/eshort/code/sandbox/hlpr_dialogue_production/speech/audio_data/test1.wav - text: '"Hello there! How are you?"' -test2: - behaviors: - - args: [] - id: test - start: 0.006 - type: action - - args: [] - id: test - start: 1.229 - type: action - - args: [] - id: test - start: 1.995 - type: action - - id: N_NG_D_Z - start: 0.006 - type: viseme - - id: EY - start: 0.069 - type: viseme - - id: N_NG_D_Z - start: 0.145 - type: viseme - - id: M_B_P - start: 0.266 - type: viseme - - id: R_ER - start: 0.373 - type: viseme - - id: EY - start: 0.442 - type: viseme - - id: N_NG_D_Z - start: 0.567 - type: viseme - - id: N_NG_D_Z - start: 0.658 - type: viseme - - id: EH_AE_AY - start: 0.744 - type: viseme - - id: N_NG_D_Z - start: 0.842 - type: viseme - - id: N_NG_D_Z - start: 0.946 - type: viseme - - id: N_NG_D_Z - start: 1.008 - type: viseme - - id: N_NG_D_Z - start: 1.128 - type: viseme - - id: AA_AH - start: 1.189 - type: viseme - - id: N_NG_D_Z - start: 1.229 - type: viseme - - id: AA_AH - start: 1.344 - type: viseme - - id: M_B_P - start: 1.503 - type: viseme - - id: EY - start: 1.567 - type: viseme - - id: AA_AH - start: 1.597 - type: viseme - - id: AA_AH - start: 1.705 - type: viseme - - id: M_B_P - start: 1.757 - type: viseme - - id: N_NG_D_Z - start: 1.821 - type: viseme - - id: EY - start: 1.891 - type: viseme - - id: AA_AH - start: 1.995 - type: viseme - - id: AA_AH - start: 2.123 - type: viseme - - id: CH_SH_ZH - start: 2.188 - type: viseme - - id: N_NG_D_Z - start: 2.285 - type: viseme - - id: N_NG_D_Z - start: 2.482 - type: viseme - - id: IDLE - start: 2.626 - type: viseme - file: /home/eshort/code/sandbox/hlpr_dialogue_production/speech/audio_data/test2.wav - text: '"This phrase tests the timing of the actions."' diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ deleted file mode 100644 index 68cfac2..0000000 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py~ +++ /dev/null @@ -1,93 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017, Elaine Short, SIM Lab -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the SIM Lab nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import rospy -import smach -import smach_ros -import actionlib -import random - -from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion -from std_msgs.msg import Header - - -from hlpr_dialogue_production.dialogue import ControllerState -import hlpr_lookat.msg - - -import actionlib_tutorials.msg - - -def lookat_controller_cb(string_args): - print string_args - if len(string_args)==1: #have just a frame name - vec3=Vector3(0.0,0.0,0.0) - elif len(string_args)==4: - point = map(lambda s: float(s), string_args[1:]) - vec3=Vector3(point[0],point[1],point[2]) - else: - rospy.logerr("Invalid arguments to lookat: {}".format(string_args)) - return None - - frame = string_args[0] - - pos = TransformStamped() - pos.child_frame_id = frame - pos.transform = Transform() - pos.transform.translation = vec3 - pos.header = Header() - waypoints = [pos] - waytimes = [rospy.Duration(0.0)] - return hlpr_lookat.msg.LookatWaypointsGoal(waypoints,waytimes) - -def get_lookat_controller(): - behaviors=["lookat"] - time_adj = None - return ControllerState("LOOKAT_CONTROLLER",behaviors, - "/lookat_waypoints_action_server", - hlpr_lookat.msg.LookatWaypointsAction, - lookat_controller_cb,time_adj) - -def gesture_controller_cb(string_args): - behaviors=["wave"] - return "" - -def get_gesture_controller(): - pass - -def test_controller_cb(string_args): - return actionlib_tutorials.msg.FibonacciGoal(order=20) - -def get_test_controller(): - behaviors=["test"] - time_adj = {"test":0.0} - return ControllerState("TEST_CONTROLLER",behaviors,"/test_beep_controller", - actionlib_tutorials.msg.FibonacciAction, - test_controller_cb, time_adj) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py~ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py~ deleted file mode 100644 index 7ca8fcf..0000000 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py~ +++ /dev/null @@ -1,373 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2017, Elaine Short, SIM Lab -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are met: -# -# * Redistributions of source code must retain the above copyright notice, this -# list of conditions and the following disclaimer. -# -# * Redistributions in binary form must reproduce the above copyright notice, -# this list of conditions and the following disclaimer in the documentation -# and/or other materials provided with the distribution. -# -# * Neither the name of the SIM Lab nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -import rospy -import smach -import smach_ros -import wave -import yaml -import threading -import actionlib -import contextlib -from sound_play.libsoundplay import SoundClient -from cordial_tts.cordial_tts import CoRDialTTS - -class Synchronizer(): - def __init__(self): - self.started = False - self.time = None - - def start(self): - self.started = True - self.time = rospy.Time.now() - - def reset(self): - self.started = False - self.time = None - -class ControllerState(smach.State): - def __init__(self, name, behaviors, topic, action_type, arg_list_to_goal_cb, behavior_time_adj=None): - smach.State.__init__(self,outcomes=["preempted","done"], - input_keys=["ordered_behaviors"]) - self.name = name - self._can_handle = behaviors - self._cb = arg_list_to_goal_cb - self._client = actionlib.SimpleActionClient(topic,action_type) - self._sync = None - if behavior_time_adj!=None: - self._time_adj = behavior_time_adj - else: - self._time_adj = {} - - def setup_sync(self,synchronizer): - self._sync=synchronizer - - def execute(self,userdata): - ordered_behaviors = filter(lambda b: b["id"] in self._can_handle, - userdata.ordered_behaviors) - - while not (self._sync!=None and self._sync.started) and not self.preempt_requested(): - rospy.sleep(0.001) - - if self.preempt_requested(): - self._client.cancel_all_goals() - self.service_preempt() - return "preempted" - - goal_sent=False - for b in ordered_behaviors: - if b["id"] in self._time_adj: - start = b["start"]-self._time_adj[b["id"]] - else: - start = b["start"] - - goal = self._cb(b["args"]) - if goal==None: - continue - while rospy.Time.now()-self._sync.time < rospy.Duration.from_sec(start) and not self.preempt_requested(): - rospy.sleep(0.001) - - if self.preempt_requested(): - self._client.cancel_all_goals() - self.service_preempt() - return "preempted" - - self._client.send_goal(goal) - goal_sent = True - if goal_sent: - while not self._client.wait_for_result(rospy.Duration(0.05)): - if self.preempt_requested(): - self._client.cancel_all_goals() - self.service_preempt() - return "preempted" - return "done" - -class TTSSpeechStart(smach.State): - def __init__(self,voice="Kimberly"): - smach.State.__init__(self,outcomes=["done"], - input_keys=["marked_text"], - output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) - - def execute(self,userdata): - text, behaviors = self._tts.extract_behaviors(userdata.marked_text) - wav_file = None - userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) - userdata.text = text - userdata.wav_file = wav_file - return "done" - -class TTSFallbackSpeechStart(smach.State): - def __init__(self, phrases, voice="Kimberly"): - smach.State.__init__(self,outcomes=["done"], - input_keys=["key_or_marked_text"], - output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) - self._phrases = phrases - - def execute(self,userdata): - if userdata.key_or_marked_text in self._phrases: - phrase = self._phrases[userdata.key_or_marked_text] - if "text" in phrase: - text = phrase["text"] - else: - text = None - wav_file = phrase["file"] - behaviors = phrase["behaviors"] - else: - text, behaviors = self._tts.extract_behaviors(userdata.key_or_marked_text) - wav_file = None - - userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) - userdata.text = text - userdata.wav_file = wav_file - return "done" - -class FileSpeechStart(smach.State): - def __init__(self, phrases): - smach.State.__init__(self,outcomes=["done","not_found"], - input_keys=["key"], - output_keys=["text","ordered_behaviors","wav_file"]) - self._phrases = phrases - - def execute(self,userdata): - if userdata.key not in self._phrases: - return "not_found" - phrase = self._phrases[userdata.key] - if "text" in phrase: - text = phrase["text"] - else: - text = None - wav_file = phrase["file"] - behaviors = phrase["behaviors"] - - userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) - userdata.text = text - userdata.wav_file = wav_file - return "done" - -class NoPrepSpeechStart(smach.State): - def __init__(self): - smach.State.__init__(self,outcomes=["done","missing_info"], - input_keys=["behaviors","wav_file_loc"], - output_keys=["text","ordered_behaviors","wav_file"]) - - def execute(self,userdata): - if userdata.behaviors==None: - return "missing_info" - if userdata.wav_file==None: - return "missing_info" - behaviors = userdata.behaviors - text = None - wav_file = userdata.wav_file - - userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) - userdata.text = text - userdata.wav_file = wav_file - return "done" - - - -class SpeechState(smach.State): - def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): - smach.State.__init__(self,outcomes=["preempted","no_audio","done"], - input_keys=["text","wav_file"]) - self._tts = use_tts - if use_tts: - self._talker = CoRDialTTS(voice) - self._sound_client = SoundClient() - self._sync = synchronizer - - def execute(self,userdata): - rospy.loginfo("Saying: {}".format(userdata.text)) - if userdata.wav_file==None: - if userdata.text!=None and len(userdata.text)!=0: - speech_duration = self._talker.say(userdata.text,wait=False) - self._sync.start() - else: - return "no_audio" - else: - wav_file = userdata.wav_file - with contextlib.closing(wave.open(wav_file,'r')) as f: - frames=f.getnframes() - rate=f.getframerate() - speech_duration=frames/float(rate) - self._sound_client.playWave(wav_file) - self._sync.start() - - while rospy.Time.now()-self._sync.time Date: Sun, 30 Jul 2017 11:44:29 -0500 Subject: [PATCH 03/36] improving documentation --- .../docs/hlpr_dialogue_production.rst | 32 ++ .../hlpr_dialogue_production/controllers.py | 115 ++++++- .../src/hlpr_dialogue_production/dialogue.py | 286 +++++++++++++++++- 3 files changed, 423 insertions(+), 10 deletions(-) create mode 100644 hlpr_dialogue_production/docs/hlpr_dialogue_production.rst diff --git a/hlpr_dialogue_production/docs/hlpr_dialogue_production.rst b/hlpr_dialogue_production/docs/hlpr_dialogue_production.rst new file mode 100644 index 0000000..9f8d5f3 --- /dev/null +++ b/hlpr_dialogue_production/docs/hlpr_dialogue_production.rst @@ -0,0 +1,32 @@ +HLPR Dialogue Production +========================= + +Controllers +----------- +.. automodule:: controllers + :members: + +Dialogue +--------- +.. automodule:: dialogue + +.. autoclass:: Synchronizer + :members: __init__, start, reset + +.. autoclass:: ControllerState + :members: __init__, setup_sync + +.. autoclass:: TTSSpeechStart + :members: __init__ + +.. autoclass:: TTSFallbackSpeechStart + :members: __init__ + +.. autoclass:: FileSpeechStart + :members: __init__ + +.. autoclass:: NoPrepSpeechStart + :members: __init__ + +.. autoclass:: SpeechState + :members: __init__ diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index 3c5353a..335fb89 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -27,6 +27,15 @@ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +"""Defines functions to create behavior controllers for dialogue production. + +This module contains functions that create controllers for each of the +behaviors that one might want to synchronize with robot speech. Currently, +this includes looking at a point in space, executing a gesture with pre- +defined waypoints, and a test controller that just plays a beeping sound (and +can be used to check synchronization). +""" + import rospy import smach @@ -34,23 +43,51 @@ import actionlib import random -from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion -from std_msgs.msg import Header -import hlpr_dialogue_production.msg as dialogue_msgs +#from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion +#from std_msgs.msg import Header +#import hlpr_dialogue_production.msg as dialogue_msgs -from hlpr_dialogue_production.dialogue import ControllerState -import hlpr_lookat.msg +#from hlpr_dialogue_production.dialogue import ControllerState +#import hlpr_lookat.msg -import actionlib_tutorials.msg +#import actionlib_tutorials.msg def lookat_controller_cb(behavior_name, string_args): + """Callback to create a LookatAction goal from string arguments + + Given a string of arguments (pulled from the behavior tags in a speech + string), determines whether the robot should look at the base of the + frame or a point relative to the frame. Prints a warning message to the + screen and returns None if the number of arguments is incorrect or they + are of the wrong type, but does not check that the first argument is a + valid frame (if it is not, the LookatWaypoints action server will return + the error instead). + + Parameters + ---------- + behavior_name : str + The name of the behavior being handled (right now, this will always + be "lookat") + string_args : list of str + The arguments that were parsed from the speech string, as strings + + Returns + ------- + LookatWaypointsGoal + Goal containing the one point to look at. + + """ if len(string_args)==1: #have just a frame name vec3=Vector3(0.0,0.0,0.0) elif len(string_args)==4: - point = map(lambda s: float(s), string_args[1:]) + try: + point = map(lambda s: float(s), string_args[1:]) + except ValueError: + rospy.logerr("Invalid arguments to lookat: {}".format(string_args)) + return None vec3=Vector3(point[0],point[1],point[2]) else: rospy.logerr("Invalid arguments to lookat: {}".format(string_args)) @@ -68,6 +105,13 @@ def lookat_controller_cb(behavior_name, string_args): return hlpr_lookat.msg.LookatWaypointsGoal(waypoints,waytimes) def get_lookat_controller(): + """ Sets up the lookat controller state + + Sets up the lookat controller state to connect to the lookat_waypoints + action server in hlpr_lookat. Does not adjust the timing of lookat + behaviors. + + """ behaviors=["lookat"] time_adj = None return ControllerState("LOOKAT_CONTROLLER",behaviors, @@ -76,12 +120,42 @@ def get_lookat_controller(): lookat_controller_cb,time_adj) def gesture_controller_cb(behavior_name, string_args): + """Callback to create a GestureGoal from string arguments + + Given a string of arguments (pulled from the behavior tags in a speech + string), selects the series of named keypoints that define the geature. + These keypoints are currently defined in the Gesture Action Server (in + ``gesture_action_server.py``. To add more keypoints, see the documentation + for that file. + + Parameters + ---------- + behavior_name : str + The name of the behavior being handled (right now, this will always + be "lookat") + string_args : list of str + The arguments that were parsed from the speech string, as strings + + Returns + ------- + GestureGoal + Gesture goal containing the list of keypoints for the gesture + + """ + gesture_poses = {"wave":["wave1","wave2","wave1","wave2"], "shrug":["right_home","shrug","right_home"], "thinking":["right_home","hmm","right_home"]} return dialogue_msgs.GestureGoal(poses=gesture_poses[behavior_name]) def get_gesture_controller(): + """ Sets up the gesture controller state + + Sets up the gesture controller state to connect to the gesture action + server in this package. Adjusts the timing of the gesture behaviors + by 1s; you may want to change this for your application. + + """ behaviors=["wave", "shrug", "thinking"] time_adj = {"wave":1.0, "shrug":1.0, @@ -92,9 +166,34 @@ def get_gesture_controller(): gesture_controller_cb, time_adj) def test_controller_cb(behavior_name, string_args): - return actionlib_tutorials.msg.FibonacciGoal(order=20) + """Callback to create a FibonacciGoal from string arguments + + The test action server just uses the Fibonacci goal from the + actionlib_tutorials package. The contents of the goal are not used. + + Parameters + ---------- + behavior_name : str + The name of the behavior being handled (right now, this will always + be "lookat") + string_args : list of str + The arguments that were parsed from the speech string, as strings + + Returns + ------- + FibonacciGoal + Fibonacci goal with order=0; contents not used. + + """ + return actionlib_tutorials.msg.FibonacciGoal(order=0) def get_test_controller(): + """ Sets up the test controller state + + Sets up the test controller state to connect to the test action + server in this package. Does not adjust the timing of behaviors. + + """ behaviors=["test"] time_adj = {"test":0.0} return ControllerState("TEST_CONTROLLER",behaviors,"/test_beep_controller", diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index bb8e8c8..ea1410f 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -30,30 +30,103 @@ import rospy import smach -import smach_ros +'''import smach_ros import wave import yaml import threading import actionlib import contextlib from sound_play.libsoundplay import SoundClient -from cordial_tts.cordial_tts import CoRDialTTS +from cordial_tts.cordial_tts import CoRDialTTS''' class Synchronizer(): + """ Object that can be passed to all controllers to synchronize their start + + A single Synchronizer object is passed to all controllers so that the + speech state can signal when the audio has begun to play. This is needed + because online text-to-speech has to download the audio from the internet + before it can begin to play, leading to a variable start time for the + speech audio. + """ + def __init__(self): + """ Creates a Synchronizer object""" self.started = False self.time = None def start(self): + """ Sets the state of the Synchronizer to started and saves the time""" self.started = True self.time = rospy.Time.now() def reset(self): + """ Resets the state of the Synchronizer to not started""" self.started = False self.time = None class ControllerState(smach.State): + """ Interface to action servers controlling robot behavior + + A ControllerState is a smach.State that sends requests to a specific + action server at the appropriate times. + + .. warning:: After creating the object, you *must* call ``setup_sync`` to provide the state with a Synchronizer. The Synchronizer is not included in the constructor so that the object can be created in ``controllers.py`` or elsewhere in code and passed to the SmachWrapper state, which will then set up the Synchronizers and assemble the dialogue act state machine. + + + **Input keys** + * ordered_behaviors : list of dict + An ordered list of all the behaviors the controller should play. A + behavior is a dict with keys "start", "id", and "args", indicating + the start time (after speech begins), name of the behavior, and any + arguments to the behavior, respectively. + + **Outcomes** + * preempted + The behavior was preempted before playing all the behaviors in the list + to completion. + * done + The controller played all of the behaviors in the list. + + """ def __init__(self, name, behaviors, topic, action_type, arg_list_to_goal_cb, behavior_time_adj=None): + """ Constructor + + Creates the ControllerState with the given name, able to handle the + given behaviors by sending the arguments to the arg_list_to_goal_cb + with a time adjustment factor of behavior_time_adj (assigned on a per- + behavior basis). By convention, the name should be in all caps, and + must not conflict with any other names in the state machine containing + this state. If using the SmachWrapper, the names "SPEECH", "START", + "DIALOGUE" are taken. + + + Parameters + ---------- + name : str + The name of this state in the state machine + + behaviors : list of str + The behaviors (from the speech string tags) that this controller + can handle + + topic : str + The topic for the action server that this controller calls + + action_type : ROS Action Type + The type for the action server that this controller calls + + arg_list_to_goal_cb : function + A function taking the name of the behavior and a list of arguments + and returning a goal for the action of type ``action_type`` + + behavior_time_adj : dict + A mapping from behavior names (from ``behaviors``) to times (in s). + The controller will send the action goal that much earlier. + Negative values will cause the controller to call the action + server later. + + """ + smach.State.__init__(self,outcomes=["preempted","done"], input_keys=["ordered_behaviors"]) self.name = name @@ -67,6 +140,19 @@ def __init__(self, name, behaviors, topic, action_type, arg_list_to_goal_cb, beh self._time_adj = {} def setup_sync(self,synchronizer): + """ Provides the controller with a Synchronizer object + + This provides the controller with information about when the speech + audio has begun. This will only work if the controller and speech + state share the same Synchronizer object. + + Parameters + ---------- + synchronizer : Synchronizer + A synchronizer object. All controllers, including the speech state, + should share the same synchronizer. + + """ self._sync=synchronizer def execute(self,userdata): @@ -110,7 +196,43 @@ def execute(self,userdata): return "done" class TTSSpeechStart(smach.State): + """ Speech prep state when using TTS + + State to process marked text to ordered behaviors, unmarked text, and an + empty wav_file, that can be passed on to the Speech state. + + + **Input keys** + * marked_text : str + Text marked up with . Behaviors will be synced to + the word following the tag. + + **Output keys** + * text : str + Text marked up with . Behaviors will be synced to + the word following the tag. + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + Always None + + **Outcomes** + * done + Finished fetching behaviors + + """ def __init__(self,voice="Kimberly"): + """ Constructor + + Initializes TTS for speech using Amazon Polly with the given voice + + Parameters + ----------- + voice : str, optional + Which Amazon Polly voice to use. Defaults to Kimberly + """ + smach.State.__init__(self,outcomes=["done"], input_keys=["marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) @@ -125,7 +247,50 @@ def execute(self,userdata): return "done" class TTSFallbackSpeechStart(smach.State): + """ Speech prep from file with online TTS fallback + + State to read text, wave file, and ordered behaviors from a phrase file, + given a key into that file. If the key isn't found, uses online TTS using + Amazon Polly. This is useful for debugging or if there are a small number + of phrases that can't be known in advance. + + **Input keys** + * key_or_marked_text : str + Either a key into the phrase file or text marked up with + . The state tries to read from the phrase file + with this string. If it's not found, assume it is marked up text + and generate the audio with TTS + + **Output keys** + * text : str + Text marked up with . Behaviors will be synced to + the word following the tag. + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + None if the audio needs to be fetched, otherwise the path to the + audio file. + + **Outcomes** + * done + Finished fetching behaviors + + """ def __init__(self, phrases, voice="Kimberly"): + """ Constructor + + Initializes TTS for speech using Amazon Polly with the given voice, and + reads in the phrase file. + + Parameters + ----------- + voice : str, optional + Which Amazon Polly voice to use. Defaults to Kimberly + + phrases : str + Path to the phrase file to use. + """ smach.State.__init__(self,outcomes=["done"], input_keys=["key_or_marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) @@ -151,7 +316,43 @@ def execute(self,userdata): return "done" class FileSpeechStart(smach.State): + """ Speech prep from file + + State to read text, wave file, and ordered behaviors from a phrase file, + given a key into that file. + + **Input keys** + * key : str + A key into the phrase file + + **Output keys** + * text : str + If the text is included in the phrase file, the text, otherwise + None + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + The path to the audio file. + + **Outcomes** + * done + Finished fetching behaviors + * not_found + Unable to find the key in the phrase file + + """ def __init__(self, phrases): + """ Constructor + + Initializes TTS for speech using a phrase file. + + Parameters + ----------- + + phrases : str + Path to the phrase file to use. + """ smach.State.__init__(self,outcomes=["done","not_found"], input_keys=["key"], output_keys=["text","ordered_behaviors","wav_file"]) @@ -174,7 +375,40 @@ def execute(self,userdata): return "done" class NoPrepSpeechStart(smach.State): + """ Pass through speech info without prep + + State for the case where the dialogue state machine will be given text, + behaviors (not necessarily ordered), and a path to a wave file in + the userdata. + + **Input keys** + * behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". + * wav_file_loc : str + The path to the audio file to play + + **Output keys** + * text : str + Always None + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + The path to the audio file. + + **Outcomes** + * done + Finished fetching behaviors + * missing_info + Missing information in the input keys + + """ def __init__(self): + """ Constructor + + Initializes passthrough state for speech features. + """ smach.State.__init__(self,outcomes=["done","missing_info"], input_keys=["behaviors","wav_file_loc"], output_keys=["text","ordered_behaviors","wav_file"]) @@ -196,7 +430,55 @@ def execute(self,userdata): class SpeechState(smach.State): + """ Speech player state + + Takes in text and/or a wave file. Given a wave file, plays the file. + If no wave file is provided and text-to-speech is on, fetch the audio from + Amazon Polly and play the audio. If no wave file is provided and text-to- + speech is off, return "no_audio" + + **Input keys** + * text : str + Can be None; the text version of the robot's speech. Used to print + to the screen. + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + Can be None if TTS is on. The path to the audio file. + + **Outcomes** + * done + Finished fetching behaviors + * no_audio + Couldn't find the wave file, or no wave file provided and TTS + turned off + * preempted + State was preempted before audio finished playing. If preempted, + will try to stop the audio. + + """ def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): + """ Constructor + + Initializes the speech state with the desired parameters; either with + or without online TTS, and with or without a pre-generated phrase + file. + + Parameters + ----------- + use_tts : bool + If true, allow online TTS + synchronizer : Synchronizer + Synchronizer object to allow sync of speech and behaviors. Should + be the same object as is passed to behavior ControllerState objects + with ``setup_sync`` + voice : str, optional + Which Amazon Polly voice to use. Defaults to Kimberly + + phrases : str, optional + Path to the phrase file to use. If None, require online TTS. + """ smach.State.__init__(self,outcomes=["preempted","no_audio","done"], input_keys=["text","wav_file"]) self._tts = use_tts From 3f3121286587b3b9305c0685c6c282baf0282683 Mon Sep 17 00:00:00 2001 From: Elaine Date: Mon, 31 Jul 2017 13:44:00 -0500 Subject: [PATCH 04/36] added some states --- .../src/hlpr_dialogue_production/dialogue.py | 69 +++++++++++++++++-- 1 file changed, 63 insertions(+), 6 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index bb8e8c8..c7ac099 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -70,6 +70,10 @@ def setup_sync(self,synchronizer): self._sync=synchronizer def execute(self,userdata): + if userdata.ordered_behaviors==None: + rospy.logwarn("Controller {} got empty behavior list".format(self.name)) + return "done" + ordered_behaviors = filter(lambda b: b["id"] in self._can_handle, userdata.ordered_behaviors) @@ -150,6 +154,31 @@ def execute(self,userdata): userdata.wav_file = wav_file return "done" +class DebugSpeechStart(smach.State): + def __init__(self): + smach.State.__init__(self,outcomes=["done"], + input_keys=["key_or_marked_text", "behaviors", + "wav_file_loc"], + output_keys=["text","ordered_behaviors","wav_file"]) + + def execute(self,userdata): + if userdata.behaviors != None: + userdata.ordered_behaviors = sorted(userdata.behaviors,key = lambda b: b["start"]) + else: + userdata.ordered_behaviors = userdata.behaviors + userdata.text = userdata.key_or_marked_text + userdata.wav_file = userdata.wav_file_loc + + + rospy.logwarn("Speech debug info:") + rospy.logwarn("Ordered Behaviors: {}".format(userdata.behaviors)) + rospy.logwarn("Text: {}".format(userdata.key_or_marked_text)) + rospy.logwarn("Wave file: {}".format(userdata.wav_file_loc)) + + return "done" + + + class FileSpeechStart(smach.State): def __init__(self, phrases): smach.State.__init__(self,outcomes=["done","not_found"], @@ -187,13 +216,21 @@ def execute(self,userdata): behaviors = userdata.behaviors text = None wav_file = userdata.wav_file - + userdata.ordered_behaviors = sorted(behaviors,key = lambda b: b["start"]) userdata.text = text userdata.wav_file = wav_file + return "done" - +class SpeechDebugState(smach.State): + def __init__(self, synchronizer): + smach.State.__init__(self,outcomes=["preempted","no_audio","done"], + input_keys=["text","wav_file"]) + self._sync = synchronizer + + def execute(self,userdata): + return "done" class SpeechState(smach.State): def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): @@ -233,8 +270,11 @@ def execute(self,userdata): return "done" class SmachWrapper(): - def __init__(self, use_tts, phrases=None, controllers=None, voice="Kimberly"): - if use_tts and phrases!=None: + def __init__(self, use_tts, phrases=None, controllers=None, voice="Kimberly",debug=False): + if debug: + condition="debug" + outcomes=["preempted","done"] + elif use_tts and phrases!=None: condition = "tts_fallback" outcomes = ["preempted","done"] #input_keys = ["key_or_marked_text"] @@ -260,6 +300,10 @@ def __init__(self, use_tts, phrases=None, controllers=None, voice="Kimberly"): def cc_child_term_cb(outcome_map): + if condition=="debug": + if "SPEECH" in outcome_map: + return True + others = [] for name, outcome in outcome_map.items(): others.append(outcome) @@ -283,9 +327,14 @@ def cc_outcome_cb(outcome_map): with self._cc: - smach.Concurrence.add("SPEECH", SpeechState(use_tts, self._sync, phrases,voice), + if condition=="debug": + smach.Concurrence.add("SPEECH", SpeechDebugState(self._sync), remapping={"text":"text", "wav_file":"wav_file"}) + else: + smach.Concurrence.add("SPEECH", SpeechState(use_tts, self._sync, phrases,voice), + remapping={"text":"text", + "wav_file":"wav_file"}) if controllers != None: for c in controllers: c.setup_sync(self._sync) @@ -295,7 +344,15 @@ def cc_outcome_cb(outcome_map): with self._sm: - if condition=="tts_fallback": + if condition=="debug": + smach.StateMachine.add("START",DebugSpeechStart(), + transitions={"done":"DIALOGUE"}, + remapping={"key_or_marked_text":"key_or_marked_text", + "text":"text", + "wav_file_loc":"wav_file_loc", + "ordered_behaviors":"ordered_behaviors", + "wav_file":"wav_file"}) + elif condition=="tts_fallback": smach.StateMachine.add("START",TTSFallbackSpeechStart(phrases), transitions={"done":"DIALOGUE"}, remapping={"key_or_marked_text":"key_or_marked_text", From 75fd6d7a4a6892e05a5064aaa22629d5b9f36311 Mon Sep 17 00:00:00 2001 From: Elaine Date: Mon, 31 Jul 2017 14:38:28 -0500 Subject: [PATCH 05/36] added debug option and updated documentation --- .../launch/all_controllers.launch | 2 +- .../src/hlpr_dialogue_production/dialogue.py | 193 +++++++++++++++++- .../standalone_server.py | 22 +- 3 files changed, 203 insertions(+), 14 deletions(-) diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch index e3304e0..23250b9 100644 --- a/hlpr_dialogue_production/launch/all_controllers.launch +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -3,5 +3,5 @@ - + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index 1bb6113..355de01 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -320,6 +320,34 @@ def execute(self,userdata): return "done" class DebugSpeechStart(smach.State): + """ Debugging speech state with no audio + + Prints the values of the provided userdata, allowing for debugging. Doesn't + actually play any sound. + + **Input keys** + * behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". + * wav_file_loc : str + The path to the audio file to play + * key_or_marked_text : str + Either a key into the phrase file or text marked up with + . + + **Output keys** + * text : str + Text marked up with . Behaviors will be synced to + the word following the tag. + * ordered_behaviors : list of dict + A list of behavior dictionaries. A behavior has the keys "id", + "start", and "args". Ordered by start time. + * wav_file : str + None if the audio needs to be fetched, otherwise the path to the + audio file. + + """ + def __init__(self): smach.State.__init__(self,outcomes=["done"], input_keys=["key_or_marked_text", "behaviors", @@ -458,7 +486,32 @@ def execute(self,userdata): return "done" class SpeechDebugState(smach.State): + """ Speech debug state + + Doesn't do anything, allowing for debugging of speech input without + requiring tts or audio files. + + **Input keys** + * text : str + Can be None; the text version of the robot's speech. Used to print + to the screen. + * wav_file : str + Can be None if TTS is on. The path to the audio file. + + **Outcomes** + * done + Finished fetching behaviors. Always returns this. + * no_audio + Couldn't find the wave file, or no wave file provided and TTS + turned off. Never returns this. + * preempted + State was preempted before audio finished playing. If preempted, + will try to stop the audio. Never returns this. + + + """ def __init__(self, synchronizer): + smach.State.__init__(self,outcomes=["preempted","no_audio","done"], input_keys=["text","wav_file"]) self._sync = synchronizer @@ -478,9 +531,6 @@ class SpeechState(smach.State): * text : str Can be None; the text version of the robot's speech. Used to print to the screen. - * ordered_behaviors : list of dict - A list of behavior dictionaries. A behavior has the keys "id", - "start", and "args". Ordered by start time. * wav_file : str Can be None if TTS is on. The path to the audio file. @@ -552,7 +602,74 @@ def execute(self,userdata): return "done" class SmachWrapper(): + """ SmachWrapper to set up dialogue state machine + + Given a set of controllers, this class will put together a state machine + that allows simultaneous speech and behaviors. You can either run the + state machine by calling ``standalone_start`` with the appropriate userdata, + or you can call ``get_sm`` to get a reference to the internal state machine + and use it as a state in a larger smach state machine. The input keys and + outcomes of the state machine depend on the options passed to the + constructor; they may include: + + **Input keys** + * key_or_marked_text : str + If a phrase file is provided and use_tts is true, or debug is true, + provides either a key into the phrase file or marked-up text to say + with online TTS + * key : str + If a phrase file is provided and use_tts is false, provides a key + into the phrase file. + * marked_text : str + If no phrase file is provided and use_tts is true, contains + marked-up text to say with online TTS + * behaviors : list of dict + If no phrase file is provided and use_tts is false, or debug is true + directly provides the behaviors for the robot to execute. A + behavior has the keys "id", "start", and "args". + * wav_file_loc : list of dict + If no phrase file is provided and use_tts is false, or debug is true + directly provides a path to an audio file for the robot to play + + **Outcomes** + * done + Successfully played the dialogue act. This is always a potential + outcome of the state machine. + * preempted + The state machine was preempted. This is always a potential outcome + of the state machine. + * not_found + If not using tts, indicates that the key was not found in the phrase + file + * missing_info + If neither using tts nor a phrase file, indicates that the robot was + not provided with behaviors and an audio file in the input userdata + + """ def __init__(self, use_tts, phrases=None, controllers=None, voice="Kimberly",debug=False): + """ Constructor + + Creates a state machine according to the provided options. + + Parameters + ----------- + use_tts : bool + Whether or not to use online TTS from Amazon Polly + + phrases : str, optional + Path to the phrase file to use. Defaults to None. + + controllers : list of ControllerState, optional + The set of controllers to use for speech. If not provided, the + state machine will play audio but no behaviors. + + voice : str, optional + Which Amazon Polly voice to use. Defaults to Kimberly + + debug : bool, optional + If true, start in debug mode, with no audio or behaviors. Defaults + to false. + """ if debug: condition="debug" outcomes=["preempted","done"] @@ -673,6 +790,16 @@ def cc_outcome_cb(outcome_map): "ordered_behaviors":"ordered_behaviors", "text":"text"}) def get_sm(self): + """ Returns the state machine + + .. warning:: Trying to run the state machine multiple times can have unexpected results. If you need to run it multiple times in various places in your code, use the ``standalone_start`` function. + + Returns + --------- + smach.StateMachine + A reference to the state machine constructed by this object. + + """ return self._sm def _service_preempt_for_children(self,sm): @@ -684,29 +811,85 @@ def _service_preempt_for_children(self,sm): except AttributeError: return - def standalone_start(self): + def standalone_start(self, userdata_dict={}): + """ Runs the state machine on its own. + + This function resets all states in the state machine, sets the + userdata using the provided dictionary (be sure it matches the + input_keys for the options you have selected), and runs the state + machine. + + Parameters + ----------- + userdata_dict : dict + A dictionary of values to update the userdata. Which values need + to be included depends on the options you provided when creating + this object. + """ self.reset() + userdata = smach.UserData() + for key in userdata_dict: + userdata[key]=userdata_dict[key] + self._s.get_sm().set_initial_state(["START"],userdata=userdata) self._t = threading.Thread(target=self._sm.execute) self._t.start() def reset(self): + """ Reset the state machine + + Resets preemption in the state machine and resets the synchronizer. + + """ self._sync.reset() self._service_preempt_for_children(self._sm) self._outcome=None def get_outcome(self): + """ Returns the outcome of the state machine. + + After the state machine has run to completion, this will return the + outcome. + + Returns + ------- + str + The outcome of the state machine. + + """ return self._outcome def preempt(self): - #self.preempter.preempt() + """ Preempt the state machine. + + Useful in the case where the state machine is running inside an action + server + """ self._sm.request_preempt() self._t.join() def is_running(self): + """ Returns whether the state machine is currently running + + Returns + -------- + bool + Whether or not the state machine is currently running + """ return self._t.isAlive() def get_active_states(self): + """ Returns the currently-active states + + If the machine is running, returns all currently-active states. + Otherwise, returns None + + Returns + ------- + list of str + The names of the currently-active states + """ if self._sm.is_running(): return self._sm.get_active_states() else: return None + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py index 6708456..e243e40 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py @@ -39,7 +39,7 @@ import hlpr_dialogue_production.msg as dialogue_msgs class HLPRDialogueAction(): - def __init__(self, use_tts, phrase_file=None, voice="Kimberly"): + def __init__(self, use_tts, phrase_file=None, voice="Kimberly", debug=False): self._as = actionlib.SimpleActionServer("HLPR_Dialogue", dialogue_msgs.DialogueActAction, execute_cb=self.execute_cb, auto_start=False) self._use_tts = use_tts @@ -50,9 +50,11 @@ def __init__(self, use_tts, phrase_file=None, voice="Kimberly"): else: self._phrases=None - self._s = SmachWrapper(self._use_tts,self._phrases,self._setup_controllers(),voice) + self._s = SmachWrapper(self._use_tts,self._phrases,self._setup_controllers(),voice,debug) - if use_tts and phrase_file!=None: + if debug: + self._condition = "debug" + elif use_tts and phrase_file!=None: self._condition = "tts_fallback" elif use_tts: self._condition = "tts_only" @@ -75,8 +77,12 @@ def _setup_controllers(self): return controllers def execute_cb(self,goal): - userdata = smach.UserData() - if self._condition=="tts_fallback": + userdata = {} + if self._condition=="debug": + userdata["key_or_marked_text"]=goal.text_or_key + userdata["behaviors"]=yaml.load(goal.behavior_yaml) + userdata["wav_file_loc"]=goal.audio_file + elif self._condition=="tts_fallback": userdata["key_or_marked_text"]=goal.text_or_key elif self._condition=="tts_only": userdata["marked_text"]=goal.text_or_key @@ -86,8 +92,7 @@ def execute_cb(self,goal): userdata["behaviors"]=yaml.load(goal.behavior_yaml) userdata["wav_file_loc"]=goal.audio_file - self._s.get_sm().set_initial_state(["START"],userdata=userdata) - self._s.standalone_start() + self._s.standalone_start(userdata) success=True while self._s.is_running(): if self._as.is_preempt_requested(): @@ -114,9 +119,10 @@ def spin(self): parser.add_argument('-v', '--voice', help="Which voice to use with TTS. Child Voices: Ivy, Justin; Adult Voices: Salli, Joey, Kimberly, Kendra, Eric, Jennifer; Silly Voices: Chipmunk", default="Kimberly") parser.add_argument('-t', '--use-tts', help="Enable text-to-speech (online)", action='store_true') parser.add_argument('-p', '--phrase-file', help="Phrase file for pre-generated speech", nargs="?", default=None) + parser.add_argument('-d', '--debug', help="Use debug mode. THIS WILL OVERRIDE -v, -t, AND -p FLAGS!", action='store_true') args = parser.parse_known_args()[0] - server = HLPRDialogueAction(args.use_tts,args.phrase_file,args.voice) + server = HLPRDialogueAction(args.use_tts,args.phrase_file,args.voice, args.debug) server.spin() From 644944fb802cc6a3f2911e9aab78f45a132cd8c6 Mon Sep 17 00:00:00 2001 From: Elaine Date: Mon, 31 Jul 2017 14:50:39 -0500 Subject: [PATCH 06/36] added cordial submodule (I hope) --- .gitmodules | 3 +++ hlpr_speech/cordial-public | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 hlpr_speech/cordial-public diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..39f8c59 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "hlpr_speech/cordial-public"] + path = hlpr_speech/cordial-public + url = git@github.com:interaction-lab/cordial-public.git diff --git a/hlpr_speech/cordial-public b/hlpr_speech/cordial-public new file mode 160000 index 0000000..5a8e9f1 --- /dev/null +++ b/hlpr_speech/cordial-public @@ -0,0 +1 @@ +Subproject commit 5a8e9f16f97f28db1422319ccd0943224249beb8 From ab2c1fd6711833a11c0c4aa364ec0c69beba14e6 Mon Sep 17 00:00:00 2001 From: eshort Date: Mon, 31 Jul 2017 14:54:20 -0500 Subject: [PATCH 07/36] Update gitmodules to point to branch --- .gitmodules | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitmodules b/.gitmodules index 39f8c59..4b0e694 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,4 @@ [submodule "hlpr_speech/cordial-public"] path = hlpr_speech/cordial-public url = git@github.com:interaction-lab/cordial-public.git + branch = catkin From 3c22d7f6a8cda5984435e8a2b59b481d5cc74882 Mon Sep 17 00:00:00 2001 From: Elaine Date: Wed, 2 Aug 2017 15:27:51 -0500 Subject: [PATCH 08/36] fixing some imports that got commented out --- .../src/hlpr_dialogue_production/controllers.py | 12 ++++++------ .../src/hlpr_dialogue_production/dialogue.py | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index 335fb89..9a49853 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -43,16 +43,16 @@ import actionlib import random -#from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion -#from std_msgs.msg import Header -#import hlpr_dialogue_production.msg as dialogue_msgs +from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion +from std_msgs.msg import Header +import hlpr_dialogue_production.msg as dialogue_msgs -#from hlpr_dialogue_production.dialogue import ControllerState -#import hlpr_lookat.msg +from hlpr_dialogue_production.dialogue import ControllerState +import hlpr_lookat.msg -#import actionlib_tutorials.msg +import actionlib_tutorials.msg def lookat_controller_cb(behavior_name, string_args): diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index 355de01..ae0c7e7 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -30,14 +30,14 @@ import rospy import smach -'''import smach_ros +import smach_ros import wave import yaml import threading import actionlib import contextlib from sound_play.libsoundplay import SoundClient -from cordial_tts.cordial_tts import CoRDialTTS''' +from cordial_tts.cordial_tts import CoRDialTTS class Synchronizer(): """ Object that can be passed to all controllers to synchronize their start From bd0fa8bef982fabf2636cefe843529017ae8dbbd Mon Sep 17 00:00:00 2001 From: Elaine Date: Thu, 3 Aug 2017 14:41:23 -0500 Subject: [PATCH 09/36] updates to dialogue files --- .../src/hlpr_dialogue_production/dialogue.py | 2 +- .../src/hlpr_dialogue_production/standalone_server.py | 7 ++++--- .../src/hlpr_dialogue_production/test_action_client.py | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index ae0c7e7..104dd03 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -830,7 +830,7 @@ def standalone_start(self, userdata_dict={}): userdata = smach.UserData() for key in userdata_dict: userdata[key]=userdata_dict[key] - self._s.get_sm().set_initial_state(["START"],userdata=userdata) + self._sm.set_initial_state(["START"],userdata=userdata) self._t = threading.Thread(target=self._sm.execute) self._t.start() diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py index e243e40..7e3efde 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py @@ -70,9 +70,10 @@ def __init__(self, use_tts, phrase_file=None, voice="Kimberly", debug=False): def _setup_controllers(self): controllers=[] - controllers=[controller_gen.get_test_controller(), - controller_gen.get_lookat_controller(), - controller_gen.get_gesture_controller(), + controllers=[ + controller_gen.get_test_controller(), + #controller_gen.get_lookat_controller(), + controller_gen.get_gesture_controller(), ] return controllers diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py index 429b7f9..92cc726 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py @@ -39,6 +39,7 @@ rospy.init_node("test_action_client") client = actionlib.SimpleActionClient("HLPR_Dialogue",dialogue_msgs.DialogueActAction) client.wait_for_server() - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I'm not sure what's going on. I'm going to keep talking though, because I need to give the gesture time to complete.")) + #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I'm not sure what's going on. I'm going to keep talking though, because I need to give the gesture time to complete.")) + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hi there.")) client.wait_for_result() print client.get_result() From c653f85c5f9b714bb2996ad1dd8395492b522377 Mon Sep 17 00:00:00 2001 From: Elaine Short Date: Sun, 6 Aug 2017 11:09:07 -0500 Subject: [PATCH 10/36] trying to get cordial working with Travis --- .gitmodules | 4 ---- .travis.yml | 1 + 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 .gitmodules diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 4b0e694..0000000 --- a/.gitmodules +++ /dev/null @@ -1,4 +0,0 @@ -[submodule "hlpr_speech/cordial-public"] - path = hlpr_speech/cordial-public - url = git@github.com:interaction-lab/cordial-public.git - branch = catkin diff --git a/.travis.yml b/.travis.yml index 4f2b6e0..ceb8aa5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -121,6 +121,7 @@ install: before_script: # source dependencies: install using wstool. - cd ~/catkin_ws/src + - git clone git@github.com:interaction-lab/cordial-public.git - wstool init - if [[ -f $ROSINSTALL_FILE ]] ; then wstool merge $ROSINSTALL_FILE ; fi - wstool up From 31de5096ccb64fa0e53b9c04daeb64f01c1e905e Mon Sep 17 00:00:00 2001 From: Elaine Short Date: Sun, 6 Aug 2017 11:14:33 -0500 Subject: [PATCH 11/36] fixing dependencies --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index ceb8aa5..8727b81 100644 --- a/.travis.yml +++ b/.travis.yml @@ -121,7 +121,7 @@ install: before_script: # source dependencies: install using wstool. - cd ~/catkin_ws/src - - git clone git@github.com:interaction-lab/cordial-public.git + - git clone git clone git://github.com/interaction-lab/cordial-public.git - wstool init - if [[ -f $ROSINSTALL_FILE ]] ; then wstool merge $ROSINSTALL_FILE ; fi - wstool up From 8bee89c46f02be0e4404ad4c37173a4cb204b0f1 Mon Sep 17 00:00:00 2001 From: Elaine Short Date: Sun, 6 Aug 2017 11:15:06 -0500 Subject: [PATCH 12/36] fixing dependencies --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8727b81..0328c29 100644 --- a/.travis.yml +++ b/.travis.yml @@ -121,7 +121,7 @@ install: before_script: # source dependencies: install using wstool. - cd ~/catkin_ws/src - - git clone git clone git://github.com/interaction-lab/cordial-public.git + - git clone -b catkin git://github.com/interaction-lab/cordial-public.git - wstool init - if [[ -f $ROSINSTALL_FILE ]] ; then wstool merge $ROSINSTALL_FILE ; fi - wstool up From c5f565c58ac14c4ca9f4d0871c2c7b51306ead5a Mon Sep 17 00:00:00 2001 From: Elaine Date: Mon, 12 Feb 2018 11:24:02 -0600 Subject: [PATCH 13/36] joint position based gesture control commented out in various places; added trajectory playback from kinesthetic teaching as a replacement --- .../launch/all_controllers.launch | 4 +- .../hlpr_dialogue_production/controllers.py | 51 +++++++++++++++++-- .../standalone_server.py | 5 +- 3 files changed, 51 insertions(+), 9 deletions(-) diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch index 23250b9..101195b 100644 --- a/hlpr_dialogue_production/launch/all_controllers.launch +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -2,6 +2,6 @@ - - + + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index 9a49853..a2e99e7 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -46,12 +46,11 @@ from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion from std_msgs.msg import Header import hlpr_dialogue_production.msg as dialogue_msgs - - -from hlpr_dialogue_production.dialogue import ControllerState +import hlpr_record_demonstration.msg as record_msgs import hlpr_lookat.msg +from hlpr_dialogue_production.dialogue import ControllerState import actionlib_tutorials.msg @@ -119,6 +118,49 @@ def get_lookat_controller(): hlpr_lookat.msg.LookatWaypointsAction, lookat_controller_cb,time_adj) + + +def keyframe_playback_controller_cb(behavior_name, string_args): + """Callback to create a PlaybackKeyframeDemoGoal from string arguments + + Given the name of a trajectory, looks up the file associated with the + name and packs it into a goal for the hlpr_kinesthetic_teaching playback + server. + + Parameters + ---------- + behavior_name : str + The name of the behavior being handled + string_args : list of str + The arguments that were parsed from the speech string, as strings + (not used) + + Returns + ------- + PlaybackKeyframeDemoGoal + Goal containing the location of the pickle file to play back + + """ + + pickle_locations={"turn_cup":"/home/eshort/robot_movements/rot_90_deg_joint.pkl", + "wave":"/home/eshort/robot_movements/rot_90_deg_joint.pkl"} + + return record_msgs.PlaybackKeyframeDemoGoal(bag_file_name=pickle_locations[behavior_name]) + +def get_keyframe_playback_controller(): + """ Sets up the keyframe playback controller state + + Sets up the keyframe playback controller to connect to the + playback_demonstration_action_server action server in hlpr_record_demonstration. + + """ + behaviors=["wave","turn_cup"] + time_adj = None + return ControllerState("KEYFRAME_PLAYBACK_CONTROLLER",behaviors, + "/lookat_waypoints_action_server", + record_msgs.LookatWaypointsAction, + keyframe_playback_controller_cb,time_adj) + def gesture_controller_cb(behavior_name, string_args): """Callback to create a GestureGoal from string arguments @@ -131,8 +173,7 @@ def gesture_controller_cb(behavior_name, string_args): Parameters ---------- behavior_name : str - The name of the behavior being handled (right now, this will always - be "lookat") + The name of the behavior being handled string_args : list of str The arguments that were parsed from the speech string, as strings diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py index 7e3efde..e7b959c 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py @@ -72,8 +72,9 @@ def _setup_controllers(self): controllers=[] controllers=[ controller_gen.get_test_controller(), - #controller_gen.get_lookat_controller(), - controller_gen.get_gesture_controller(), + controller_gen.get_lookat_controller(), + #controller_gen.get_gesture_controller(), + controller_gen.get_keyframe_playback_controller(), ] return controllers From bee505e00c7407ec32db4a2e931098e2840e85c6 Mon Sep 17 00:00:00 2001 From: Adam Allevato Date: Mon, 12 Feb 2018 11:54:51 -0600 Subject: [PATCH 14/36] Fixed include path for hlpr_lookat action --- .../src/hlpr_dialogue_production/controllers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index a2e99e7..3f8db77 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -47,6 +47,7 @@ from std_msgs.msg import Header import hlpr_dialogue_production.msg as dialogue_msgs import hlpr_record_demonstration.msg as record_msgs +import hlpr_lookat.msg as lookat_msgs import hlpr_lookat.msg @@ -158,7 +159,7 @@ def get_keyframe_playback_controller(): time_adj = None return ControllerState("KEYFRAME_PLAYBACK_CONTROLLER",behaviors, "/lookat_waypoints_action_server", - record_msgs.LookatWaypointsAction, + lookat_msgs.LookatWaypointsAction, keyframe_playback_controller_cb,time_adj) def gesture_controller_cb(behavior_name, string_args): From e52be59be153db2b4863357508fd4b251f236ca7 Mon Sep 17 00:00:00 2001 From: Adam Allevato Date: Mon, 12 Feb 2018 13:23:31 -0600 Subject: [PATCH 15/36] Added command line and roslaunch arguments to control functionality --- .../launch/all_controllers.launch | 14 ++++++++++++-- .../hlpr_dialogue_production/test_action_client.py | 6 +++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch index 101195b..bbea7ad 100644 --- a/hlpr_dialogue_production/launch/all_controllers.launch +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -1,7 +1,17 @@ + + + + - - + + + + + + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py index 92cc726..79e5d99 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py @@ -33,6 +33,7 @@ import smach_ros import actionlib import hlpr_dialogue_production.msg as dialogue_msgs +import sys if __name__ == "__main__": @@ -40,6 +41,9 @@ client = actionlib.SimpleActionClient("HLPR_Dialogue",dialogue_msgs.DialogueActAction) client.wait_for_server() #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I'm not sure what's going on. I'm going to keep talking though, because I need to give the gesture time to complete.")) - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hi there.")) + text_or_key = "Hello world" + if len(sys.argv) > 1: + text_or_key = sys.argv[1] + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key=text_or_key)) client.wait_for_result() print client.get_result() From f91644403a000942b6ab00ca3c784502dd650704 Mon Sep 17 00:00:00 2001 From: Adam Allevato Date: Tue, 13 Feb 2018 12:25:30 -0600 Subject: [PATCH 16/36] Fixed keyframe specification --- .../hlpr_dialogue_production/controllers.py | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index 3f8db77..b92b4de 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -42,6 +42,7 @@ import smach_ros import actionlib import random +import os from geometry_msgs.msg import TransformStamped, Transform, Vector3, Quaternion from std_msgs.msg import Header @@ -142,11 +143,31 @@ def keyframe_playback_controller_cb(behavior_name, string_args): Goal containing the location of the pickle file to play back """ + rospy.loginfo("Got keyframe controller callback") pickle_locations={"turn_cup":"/home/eshort/robot_movements/rot_90_deg_joint.pkl", "wave":"/home/eshort/robot_movements/rot_90_deg_joint.pkl"} + filename = "" - return record_msgs.PlaybackKeyframeDemoGoal(bag_file_name=pickle_locations[behavior_name]) + home_path = os.path.expanduser("~") + "/robot_movements/" + string_args[0] + ".pkl" + + if string_args[0] in pickle_locations: + filename = pickle_locations[string_args[0]] + elif os.path.exists(string_args[0]): + filename = string_args[0] + elif os.path.exists(home_path): + filename = home_path + else: + pass + + if filename == "": + rospy.logerr("could not find file for the behavior specified as '" + string_args[0] + "'") + rospy.logerr("I looked in the following locations:") + looked_in = pickle_locations.values() + [string_args[0], home_path] + rospy.logerr(str(looked_in)) + else: + rospy.loginfo("loading behavior from file " + filename) + return record_msgs.PlaybackKeyframeDemoGoal(bag_file_name=filename) def get_keyframe_playback_controller(): """ Sets up the keyframe playback controller state @@ -155,11 +176,11 @@ def get_keyframe_playback_controller(): playback_demonstration_action_server action server in hlpr_record_demonstration. """ - behaviors=["wave","turn_cup"] + behaviors=["keyframe"] time_adj = None return ControllerState("KEYFRAME_PLAYBACK_CONTROLLER",behaviors, - "/lookat_waypoints_action_server", - lookat_msgs.LookatWaypointsAction, + "/playback_keyframe_demo", + record_msgs.PlaybackKeyframeDemoAction, keyframe_playback_controller_cb,time_adj) def gesture_controller_cb(behavior_name, string_args): From 415e58d54fb34dad8a5f0f928c26c910b9fe8869 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 18 May 2018 12:44:51 -0500 Subject: [PATCH 17/36] Text to speech using AWS --- .../AWS_speech_synthesis.py | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py diff --git a/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py new file mode 100644 index 0000000..5d075fe --- /dev/null +++ b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py @@ -0,0 +1,165 @@ +#!/usr/bin/env python +import boto3 +import pygame +from pygame import mixer +import sys +import re +import json +import tempfile +import os + +class TextToSpeech(): + def __init__(self, voice='Kimberly'): + self.tag_follow_indices = {} + self.tags = [] + self.client = boto3.client('polly') + self.voice = voice + mixer.pre_init(22050, -16, 2, 2048) + + def collect_tags(self, tagged_text): + self.tags = re.findall(r'<.+?>',tagged_text) + #print self.tags + + def remove_tags(self, tagged_text): + untagged_text = '' + open_brackets_idx = [m.start() for m in re.finditer('<', tagged_text)] + close_brackets_idx = [m.start() for m in re.finditer('>', tagged_text)] + assert(len(open_brackets_idx)==len(close_brackets_idx)) + + open_brackets_idx.sort() + close_brackets_idx.sort() + + pointer = 0 + for i in range(len(open_brackets_idx)): + if(open_brackets_idx[i]!=0): + untagged_text = untagged_text + tagged_text[pointer:open_brackets_idx[i]-1] + pointer = close_brackets_idx[i]+1 + if(pointer!=len(tagged_text)): + untagged_text = untagged_text + tagged_text[pointer:] + + return untagged_text + + def extract_behaviors(self, tagged_text): + # Remove tags from the input string + untagged_text = self.remove_tags(tagged_text) + untagged_word_list = untagged_text.split() + self.collect_tags(tagged_text) + #print untagged_word_list + # Store which word the tags come after + for tag in list(set(self.tags)): + #tag_idx = tagged_text.find(tag) #finds only the first occurance + tag_idxs = [m.start() for m in re.finditer(tag, tagged_text)] # find all occurances + for tag_idx in tag_idxs: + if tag_idx!=0: + substring = tagged_text[:tag_idx] + if(substring[-1]==' '): + substring = substring[:-1] + untagged_substring = self.remove_tags(substring) + prev_word_idx = untagged_substring.count(' ') + 1 + + if tag not in self.tag_follow_indices: + self.tag_follow_indices[tag] = [prev_word_idx] + else: + self.tag_follow_indices[tag].append(prev_word_idx) + else: + if tag not in self.tag_follow_indices: + self.tag_follow_indices[tag] = [0] + else: + self.tag_follow_indices[tag].append(0) + #print self.tag_follow_indices + + # Fetch meta info about speech from AWS using boto3 + meta_info = self.client.synthesize_speech( + OutputFormat='json', + SpeechMarkTypes=['viseme','word'], + Text=untagged_text, + VoiceId=self.voice) + print (meta_info) + + # TODO: Unpack meta info json to an unsorted list of dictionaries + for key in meta_info: + print key + + + def phrase_to_file(self, tagged_text, output_file_loc): + # Remove tags from the input string + untagged_text = self.remove_tags(tagged_text) + + # Fetch audio for speech from AWS using boto3 + spoken_text = self.client.synthesize_speech( + OutputFormat='mp3', + #SpeechMarkTypes=['viseme','word','sentence'], + Text=untagged_text, + VoiceId=self.voice) + + # Write audio to a file + with open(output_file_loc,'wb') as f: + f.write(spoken_text['AudioStream'].read()) + f.close() + + def say(self, untagged_text, wait=False, interrupt=True): + if interrupt: + self.shutup() + + # Get audio file from AWS + spoken_text = self.client.synthesize_speech( + OutputFormat='mp3', + Text=untagged_text, + VoiceId=self.voice) + + #TODO: play audio using pygame by piping a tmp audio file + """ + with tempfile.NamedTemporaryFile("w+b", suffix='.mp3') as f: + f.write(spoken_text['AudioStream'].read()) + mixer.music.load(f) + mixer.music.play() + """ + + with open('/home/asaran/Documents/sync_speech_behaviors/output.mp3','wb') as f: + f.write(spoken_text['AudioStream'].read()) + f.close() + + pygame.init() + mixer.init() + try: + sound = mixer.Sound('/home/asaran/Documents/sync_speech_behaviors/output.mp3') + print 'the sound file is',sound.get_length(),'seconds long' + mixer.music.load('/home/asaran/Documents/sync_speech_behaviors/output.mp3') + mixer.music.play() + except: + raise UserWarning, 'could not load or play soundfile :(' + + if wait: + while self.is_speaking() == True: + pass + else: + # TODO: Amount of time left to play the audio + time_left = (sound.get_length() - mixer.music.get_pos())*-1 + print 'time left is',time_left,'seconds' + return time_left + return + + def is_speaking(self): + # Returns whether or not audio is being played + return mixer.music.get_busy() + + def shutup(self): + # Stops playing the audio + pygame.quit() + mixer.quit() + if os.path.exists('/home/asaran/Documents/sync_speech_behaviors/output.mp3'): + os.remove('/home/asaran/Documents/sync_speech_behaviors/output.mp3') + +if __name__ == '__main__': + tagged_string = "Hello ! How are you?" + print tagged_string + obj = TextToSpeech(voice='Kimberly') + obj.extract_behaviors(tagged_string) + obj.phrase_to_file(tagged_string, 'out.mp3') + untagged_string = obj.remove_tags(tagged_string) + obj.say(untagged_string, True, False) + + + + + From ff22810a8910fa4bc8a3de6983cce22d6951dd12 Mon Sep 17 00:00:00 2001 From: maxsvetlik Date: Wed, 5 Sep 2018 17:28:50 -0500 Subject: [PATCH 18/36] Visemes for speech production (experimental, unsupported) --- hlpr_dialogue_production/CMakeLists.txt | 1 + hlpr_dialogue_production/action/Viseme.action | 5 + .../launch/all_controllers.launch | 6 +- .../hlpr_dialogue_production/controllers.py | 42 +++++++++ .../src/hlpr_dialogue_production/dialogue.py | 5 +- .../standalone_server.py | 3 +- .../test_action_client.py | 14 ++- .../viseme_action_server.py | 94 +++++++++++++++++++ 8 files changed, 160 insertions(+), 10 deletions(-) create mode 100644 hlpr_dialogue_production/action/Viseme.action create mode 100755 hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py diff --git a/hlpr_dialogue_production/CMakeLists.txt b/hlpr_dialogue_production/CMakeLists.txt index d4c2a86..846b9c3 100644 --- a/hlpr_dialogue_production/CMakeLists.txt +++ b/hlpr_dialogue_production/CMakeLists.txt @@ -65,6 +65,7 @@ catkin_python_setup() FILES DialogueAct.action Gesture.action + Viseme.action ) # Generate added messages and services with any dependencies listed here diff --git a/hlpr_dialogue_production/action/Viseme.action b/hlpr_dialogue_production/action/Viseme.action new file mode 100644 index 0000000..aaa72b6 --- /dev/null +++ b/hlpr_dialogue_production/action/Viseme.action @@ -0,0 +1,5 @@ +string viseme +--- +bool success +--- +string current_pose \ No newline at end of file diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch index bbea7ad..bd5eb75 100644 --- a/hlpr_dialogue_production/launch/all_controllers.launch +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -1,12 +1,14 @@ - - + + + + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index b92b4de..b761878 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -228,6 +228,48 @@ def get_gesture_controller(): dialogue_msgs.GestureAction, gesture_controller_cb, time_adj) +def viseme_controller_cb(behavior_name, string_args): + """Callback to create a VisemeGoal from string arguments + + Given a string of arguments (pulled from the behavior tags in a speech + string), selects the series of named keypoints that define the geature. + These keypoints are currently defined in the Gesture Action Server (in + ``gesture_action_server.py``. To add more keypoints, see the documentation + for that file. + + Parameters + ---------- + behavior_name : str + The name of the behavior being handled + string_args : list of str + The arguments that were parsed from the speech string, as strings + + Returns + ------- + VisemeGoal + Viseme goal containing the name of the viseme + + """ + return dialogue_msgs.VisemeGoal(viseme=string_args) + +def get_viseme_controller(): + """ Sets up the viseme controller state + + Sets up the viseme controller state to connect to the viseme action + server in this package. + + """ + + + time_adj = {"viseme":0.2} + + behaviors=time_adj.keys() + + return ControllerState("VISEME_CONTROLLER", behaviors, "/HLPR_Visemes", + dialogue_msgs.VisemeAction, + viseme_controller_cb, time_adj) + + def test_controller_cb(behavior_name, string_args): """Callback to create a FibonacciGoal from string arguments diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index 104dd03..58e33aa 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -181,7 +181,7 @@ def execute(self,userdata): goal = self._cb(b["id"],b["args"]) if goal==None: continue - while rospy.Time.now()-self._sync.time < rospy.Duration.from_sec(start) and not self.preempt_requested(): + while not self.preempt_requested() and rospy.Time.now()-self._sync.time < rospy.Duration.from_sec(start): rospy.sleep(0.001) if self.preempt_requested(): @@ -305,7 +305,7 @@ def execute(self,userdata): if userdata.key_or_marked_text in self._phrases: phrase = self._phrases[userdata.key_or_marked_text] if "text" in phrase: - text = phrase["text"] + text = phrase["text"] else: text = None wav_file = phrase["file"] @@ -579,6 +579,7 @@ def execute(self,userdata): if userdata.wav_file==None: if userdata.text!=None and len(userdata.text)!=0: speech_duration = self._talker.say(userdata.text,wait=False) + rospy.sleep(0.5) self._sync.start() else: return "no_audio" diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py index e7b959c..b3159dc 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py @@ -72,9 +72,10 @@ def _setup_controllers(self): controllers=[] controllers=[ controller_gen.get_test_controller(), - controller_gen.get_lookat_controller(), + #controller_gen.get_lookat_controller(), #controller_gen.get_gesture_controller(), controller_gen.get_keyframe_playback_controller(), + controller_gen.get_viseme_controller(), ] return controllers diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py index 79e5d99..a551336 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py @@ -40,10 +40,14 @@ rospy.init_node("test_action_client") client = actionlib.SimpleActionClient("HLPR_Dialogue",dialogue_msgs.DialogueActAction) client.wait_for_server() - #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I'm not sure what's going on. I'm going to keep talking though, because I need to give the gesture time to complete.")) - text_or_key = "Hello world" - if len(sys.argv) > 1: - text_or_key = sys.argv[1] - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key=text_or_key)) + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hello! My name is Moe.")) + client.wait_for_result() + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I am a robot!")) + client.wait_for_result() + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I was built at the Socially Intelligent Machines lab.")) #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hello!")) + #text_or_key = "Hello world" + #if len(sys.argv) > 1: + # text_or_key = sys.argv[1] + #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key=text_or_key)) client.wait_for_result() print client.get_result() diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py new file mode 100755 index 0000000..027678e --- /dev/null +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python + +# Copyright (c) 2017, Elaine Short, SIM Lab +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are met: +# +# * Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# * Neither the name of the SIM Lab nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import rospy +import actionlib +from poli_msgs.srv import LedEye, LedEyeRequest +import hlpr_dialogue_production.msg as dialogue_msgs + +class LedVisemeActionServer: + def __init__(self): + self._as = actionlib.SimpleActionServer("HLPR_Visemes",dialogue_msgs.VisemeAction, execute_cb=self.execute_cb, auto_start=False) + self.change_eye = rospy.ServiceProxy("/led_eye",LedEye) + self._as.start() + self.viseme_mapping = {"p": LedEyeRequest.FLAT, + "t": LedEyeRequest.FLAT, + "S": LedEyeRequest.FLAT, + "T": LedEyeRequest.FLAT, + "f": LedEyeRequest.FLAT, + "k": LedEyeRequest.BIGOPEN, + "i": LedEyeRequest.OPEN, + "r": LedEyeRequest.FLAT, + "s": LedEyeRequest.FLAT, + "u": LedEyeRequest.FLAT, + "@": LedEyeRequest.BIGOPEN, + "a": LedEyeRequest.BIGOPEN, + "e": LedEyeRequest.OPEN, + "E": LedEyeRequest.OPEN, + "i": LedEyeRequest.OPEN, + "o": LedEyeRequest.WHISTLE, + "O": LedEyeRequest.BIGOPEN, + "u": LedEyeRequest.WHISTLE, + "sil": LedEyeRequest.SMILE} + self.prev_viseme = "sil" + + + def execute_cb(self,req): + if req.viseme != self.prev_viseme: + l.change_eye(command=LedEyeRequest.UPDATE, which_part=LedEyeRequest.MOUTH, which_feature=LedEyeRequest.SHAPE, mouth_shape=self.viseme_mapping[req.viseme]) + self.prev_viseme = req.viseme + self._as.set_succeeded(dialogue_msgs.VisemeResult(success=True)) + + +'''{"p": "M_B_P", + "t": "N_NG_D_Z", + "S": "CH_SH_ZH", + "T": "N_NG_D_Z", + "f": "M_B_P", + "k": "AA_AH", + "i": "EY", + "r": "R_ER", + "s": "N_NG_D_Z", + "u": "CH_SH_ZH", + "@": "AA_AH", + "a": "AA_AH", + "e": "EY", + "E": "EH_AE_AY", + "i": "EY", + "o": "AO_AW", + "O": "AA_AH", + "u": "AO_AW", + "sil": "IDLE"}''' + + +if __name__=="__main__": + rospy.init_node("viseme_action_server") + l = LedVisemeActionServer() + From 78725851540ec61aabf55388cc18201bf96bd9f7 Mon Sep 17 00:00:00 2001 From: "Moe @ moe1" Date: Fri, 7 Dec 2018 13:15:41 -0600 Subject: [PATCH 19/36] Old changes made by Elaine --- hlpr_dialogue_production/launch/all_controllers.launch | 2 +- .../src/hlpr_dialogue_production/standalone_server.py | 2 +- .../src/hlpr_dialogue_production/viseme_action_server.py | 6 ++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/hlpr_dialogue_production/launch/all_controllers.launch b/hlpr_dialogue_production/launch/all_controllers.launch index bd5eb75..5f0c8d7 100644 --- a/hlpr_dialogue_production/launch/all_controllers.launch +++ b/hlpr_dialogue_production/launch/all_controllers.launch @@ -8,7 +8,7 @@ - + diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py index b3159dc..38468d7 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/standalone_server.py @@ -74,7 +74,7 @@ def _setup_controllers(self): controller_gen.get_test_controller(), #controller_gen.get_lookat_controller(), #controller_gen.get_gesture_controller(), - controller_gen.get_keyframe_playback_controller(), + #controller_gen.get_keyframe_playback_controller(), controller_gen.get_viseme_controller(), ] return controllers diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py index 027678e..3dee554 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py @@ -37,7 +37,6 @@ class LedVisemeActionServer: def __init__(self): self._as = actionlib.SimpleActionServer("HLPR_Visemes",dialogue_msgs.VisemeAction, execute_cb=self.execute_cb, auto_start=False) self.change_eye = rospy.ServiceProxy("/led_eye",LedEye) - self._as.start() self.viseme_mapping = {"p": LedEyeRequest.FLAT, "t": LedEyeRequest.FLAT, "S": LedEyeRequest.FLAT, @@ -58,11 +57,14 @@ def __init__(self): "u": LedEyeRequest.WHISTLE, "sil": LedEyeRequest.SMILE} self.prev_viseme = "sil" + self._as.start() + rospy.loginfo("Viseme server ready to go") def execute_cb(self,req): + rospy.loginfo("Got request: {}".format(req)) if req.viseme != self.prev_viseme: - l.change_eye(command=LedEyeRequest.UPDATE, which_part=LedEyeRequest.MOUTH, which_feature=LedEyeRequest.SHAPE, mouth_shape=self.viseme_mapping[req.viseme]) + self.change_eye(command=LedEyeRequest.UPDATE, which_part=LedEyeRequest.MOUTH, which_feature=LedEyeRequest.SHAPE, mouth_shape=self.viseme_mapping[req.viseme]) self.prev_viseme = req.viseme self._as.set_succeeded(dialogue_msgs.VisemeResult(success=True)) From ffae88a7ce0caf74bbc9cb6cdfd2fa151032bac0 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 19 Apr 2019 17:12:45 -0500 Subject: [PATCH 20/36] tmp file creation to play audio in pygame --- .../AWS_speech_synthesis.py | 166 ++++++++++-------- 1 file changed, 88 insertions(+), 78 deletions(-) diff --git a/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py index 5d075fe..22cd0f4 100644 --- a/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py +++ b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py @@ -7,21 +7,22 @@ import json import tempfile import os +from contextlib import closing +import io class TextToSpeech(): def __init__(self, voice='Kimberly'): - self.tag_follow_indices = {} + self.tag_follow_indices = {} self.tags = [] self.client = boto3.client('polly') self.voice = voice - mixer.pre_init(22050, -16, 2, 2048) + # mixer.pre_init(22050, -16, 2, 2048) def collect_tags(self, tagged_text): - self.tags = re.findall(r'<.+?>',tagged_text) - #print self.tags + self.tags = re.findall(r'<.+?>',tagged_text) def remove_tags(self, tagged_text): - untagged_text = '' + untagged_text = '' open_brackets_idx = [m.start() for m in re.finditer('<', tagged_text)] close_brackets_idx = [m.start() for m in re.finditer('>', tagged_text)] assert(len(open_brackets_idx)==len(close_brackets_idx)) @@ -33,9 +34,9 @@ def remove_tags(self, tagged_text): for i in range(len(open_brackets_idx)): if(open_brackets_idx[i]!=0): untagged_text = untagged_text + tagged_text[pointer:open_brackets_idx[i]-1] - pointer = close_brackets_idx[i]+1 + pointer = close_brackets_idx[i]+1 if(pointer!=len(tagged_text)): - untagged_text = untagged_text + tagged_text[pointer:] + untagged_text = untagged_text + tagged_text[pointer:] return untagged_text @@ -44,10 +45,10 @@ def extract_behaviors(self, tagged_text): untagged_text = self.remove_tags(tagged_text) untagged_word_list = untagged_text.split() self.collect_tags(tagged_text) - #print untagged_word_list + # Store which word the tags come after for tag in list(set(self.tags)): - #tag_idx = tagged_text.find(tag) #finds only the first occurance + #tag_idx = tagged_text.find(tag) #finds only the first occurance tag_idxs = [m.start() for m in re.finditer(tag, tagged_text)] # find all occurances for tag_idx in tag_idxs: if tag_idx!=0: @@ -58,86 +59,101 @@ def extract_behaviors(self, tagged_text): prev_word_idx = untagged_substring.count(' ') + 1 if tag not in self.tag_follow_indices: - self.tag_follow_indices[tag] = [prev_word_idx] - else: - self.tag_follow_indices[tag].append(prev_word_idx) - else: + self.tag_follow_indices[tag] = [prev_word_idx] + else: + self.tag_follow_indices[tag].append(prev_word_idx) + else: if tag not in self.tag_follow_indices: self.tag_follow_indices[tag] = [0] else: self.tag_follow_indices[tag].append(0) - #print self.tag_follow_indices # Fetch meta info about speech from AWS using boto3 - meta_info = self.client.synthesize_speech( - OutputFormat='json', - SpeechMarkTypes=['viseme','word'], - Text=untagged_text, - VoiceId=self.voice) - print (meta_info) + response = self.client.synthesize_speech( + OutputFormat='json', + SpeechMarkTypes=['viseme','word'], + Text=untagged_text, + VoiceId=self.voice) - # TODO: Unpack meta info json to an unsorted list of dictionaries - for key in meta_info: - print key + # Unpack meta info json to an unsorted list of dictionaries + s = [] + if "AudioStream" in response: + with closing(response["AudioStream"]) as stream: + data = stream.read() + + s = data.split('\n') + s = [json.loads(line) for line in s if line != ''] + else: + print("Could not stream audio") + # print(s) + # sys.exit(-1) + return untagged_text, s def phrase_to_file(self, tagged_text, output_file_loc): # Remove tags from the input string - untagged_text = self.remove_tags(tagged_text) + # untagged_text = self.remove_tags(tagged_text) + untagged_text, s = obj.extract_behaviors(tagged_text) # Fetch audio for speech from AWS using boto3 - spoken_text = self.client.synthesize_speech( - OutputFormat='mp3', - #SpeechMarkTypes=['viseme','word','sentence'], - Text=untagged_text, - VoiceId=self.voice) + spoken_text = self.client.synthesize_speech( + OutputFormat='mp3', + #SpeechMarkTypes=['viseme','word','sentence'], + Text=untagged_text, + VoiceId=self.voice) # Write audio to a file with open(output_file_loc,'wb') as f: f.write(spoken_text['AudioStream'].read()) f.close() - def say(self, untagged_text, wait=False, interrupt=True): - if interrupt: - self.shutup() - - # Get audio file from AWS - spoken_text = self.client.synthesize_speech( - OutputFormat='mp3', - Text=untagged_text, - VoiceId=self.voice) + b = { + 'text': untagged_text, + 'file': os.getcwd() + '/' + output_file_loc, + 'behaviors': s + } - #TODO: play audio using pygame by piping a tmp audio file - """ - with tempfile.NamedTemporaryFile("w+b", suffix='.mp3') as f: - f.write(spoken_text['AudioStream'].read()) - mixer.music.load(f) - mixer.music.play() - """ - - with open('/home/asaran/Documents/sync_speech_behaviors/output.mp3','wb') as f: - f.write(spoken_text['AudioStream'].read()) - f.close() + return b - pygame.init() - mixer.init() - try: - sound = mixer.Sound('/home/asaran/Documents/sync_speech_behaviors/output.mp3') - print 'the sound file is',sound.get_length(),'seconds long' - mixer.music.load('/home/asaran/Documents/sync_speech_behaviors/output.mp3') - mixer.music.play() - except: - raise UserWarning, 'could not load or play soundfile :(' - - if wait: - while self.is_speaking() == True: - pass - else: - # TODO: Amount of time left to play the audio - time_left = (sound.get_length() - mixer.music.get_pos())*-1 - print 'time left is',time_left,'seconds' - return time_left - return + def say(self, untagged_text, wait=False, interrupt=True): + # if interrupt: + # self.shutup() + + response = self.client.synthesize_speech( + OutputFormat='json', + SpeechMarkTypes=['viseme','word'], + Text=untagged_text, + VoiceId=self.voice) + + with tempfile.SpooledTemporaryFile() as f: + if "AudioStream" in response: + with closing(response["AudioStream"]) as stream: + try: + f.write(stream.read()) + except IOError as error: + print(error) + sys.exit(-1) + + else: + print("Could not stream audio") + sys.exit(-1) + f.seek(0) + + if not pygame.mixer.get_init(): + pygame.mixer.init() + else: + if interrupt: + pygame.mixer.stop() + channel = pygame.mixer.Channel(5) + sound = pygame.mixer.Sound(file=f) + channel.play(sound) + + if wait: + while channel.get_busy(): + pass + return -1 + + return sound.get_length() def is_speaking(self): # Returns whether or not audio is being played @@ -152,14 +168,8 @@ def shutup(self): if __name__ == '__main__': tagged_string = "Hello ! How are you?" - print tagged_string - obj = TextToSpeech(voice='Kimberly') - obj.extract_behaviors(tagged_string) - obj.phrase_to_file(tagged_string, 'out.mp3') - untagged_string = obj.remove_tags(tagged_string) - obj.say(untagged_string, True, False) - + print(tagged_string) + obj = TextToSpeech(voice='Kimberly') - - - + b = obj.phrase_to_file(tagged_string, 'data/out.mp3') + obj.say(b['text'], wait=True, interrupt=False) \ No newline at end of file From 2438bb8f1b2c0887cebcd5ba0e28acd382c01d57 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 26 Apr 2019 16:16:50 -0500 Subject: [PATCH 21/36] Text to speech tested and working --- .../AWS_speech_synthesis.py | 27 +++++-------------- 1 file changed, 7 insertions(+), 20 deletions(-) diff --git a/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py index 22cd0f4..d895929 100644 --- a/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py +++ b/hlpr_speech_synthesis/src/hlpr_speech_synthesis/AWS_speech_synthesis.py @@ -16,7 +16,6 @@ def __init__(self, voice='Kimberly'): self.tags = [] self.client = boto3.client('polly') self.voice = voice - # mixer.pre_init(22050, -16, 2, 2048) def collect_tags(self, tagged_text): self.tags = re.findall(r'<.+?>',tagged_text) @@ -48,7 +47,6 @@ def extract_behaviors(self, tagged_text): # Store which word the tags come after for tag in list(set(self.tags)): - #tag_idx = tagged_text.find(tag) #finds only the first occurance tag_idxs = [m.start() for m in re.finditer(tag, tagged_text)] # find all occurances for tag_idx in tag_idxs: if tag_idx!=0: @@ -85,20 +83,17 @@ def extract_behaviors(self, tagged_text): s = [json.loads(line) for line in s if line != ''] else: print("Could not stream audio") - # print(s) - # sys.exit(-1) return untagged_text, s def phrase_to_file(self, tagged_text, output_file_loc): + # Remove tags from the input string - # untagged_text = self.remove_tags(tagged_text) untagged_text, s = obj.extract_behaviors(tagged_text) # Fetch audio for speech from AWS using boto3 spoken_text = self.client.synthesize_speech( OutputFormat='mp3', - #SpeechMarkTypes=['viseme','word','sentence'], Text=untagged_text, VoiceId=self.voice) @@ -116,16 +111,13 @@ def phrase_to_file(self, tagged_text, output_file_loc): return b def say(self, untagged_text, wait=False, interrupt=True): - # if interrupt: - # self.shutup() response = self.client.synthesize_speech( - OutputFormat='json', - SpeechMarkTypes=['viseme','word'], + OutputFormat='ogg_vorbis', Text=untagged_text, VoiceId=self.voice) - with tempfile.SpooledTemporaryFile() as f: + with tempfile.TemporaryFile() as f: if "AudioStream" in response: with closing(response["AudioStream"]) as stream: try: @@ -137,6 +129,7 @@ def say(self, untagged_text, wait=False, interrupt=True): else: print("Could not stream audio") sys.exit(-1) + f.seek(0) if not pygame.mixer.get_init(): @@ -145,7 +138,8 @@ def say(self, untagged_text, wait=False, interrupt=True): if interrupt: pygame.mixer.stop() channel = pygame.mixer.Channel(5) - sound = pygame.mixer.Sound(file=f) + channel.set_volume(1.0) + sound = pygame.mixer.Sound(f) channel.play(sound) if wait: @@ -153,23 +147,16 @@ def say(self, untagged_text, wait=False, interrupt=True): pass return -1 + return sound.get_length() def is_speaking(self): # Returns whether or not audio is being played return mixer.music.get_busy() - def shutup(self): - # Stops playing the audio - pygame.quit() - mixer.quit() - if os.path.exists('/home/asaran/Documents/sync_speech_behaviors/output.mp3'): - os.remove('/home/asaran/Documents/sync_speech_behaviors/output.mp3') - if __name__ == '__main__': tagged_string = "Hello ! How are you?" print(tagged_string) obj = TextToSpeech(voice='Kimberly') - b = obj.phrase_to_file(tagged_string, 'data/out.mp3') obj.say(b['text'], wait=True, interrupt=False) \ No newline at end of file From 640ec08c54b8da81f2a22d022530ae8f7a2f46ba Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 26 Apr 2019 16:24:06 -0500 Subject: [PATCH 22/36] AWS text to speech --- .../AWS_text2speech.py | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py new file mode 100644 index 0000000..d895929 --- /dev/null +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python +import boto3 +import pygame +from pygame import mixer +import sys +import re +import json +import tempfile +import os +from contextlib import closing +import io + +class TextToSpeech(): + def __init__(self, voice='Kimberly'): + self.tag_follow_indices = {} + self.tags = [] + self.client = boto3.client('polly') + self.voice = voice + + def collect_tags(self, tagged_text): + self.tags = re.findall(r'<.+?>',tagged_text) + + def remove_tags(self, tagged_text): + untagged_text = '' + open_brackets_idx = [m.start() for m in re.finditer('<', tagged_text)] + close_brackets_idx = [m.start() for m in re.finditer('>', tagged_text)] + assert(len(open_brackets_idx)==len(close_brackets_idx)) + + open_brackets_idx.sort() + close_brackets_idx.sort() + + pointer = 0 + for i in range(len(open_brackets_idx)): + if(open_brackets_idx[i]!=0): + untagged_text = untagged_text + tagged_text[pointer:open_brackets_idx[i]-1] + pointer = close_brackets_idx[i]+1 + if(pointer!=len(tagged_text)): + untagged_text = untagged_text + tagged_text[pointer:] + + return untagged_text + + def extract_behaviors(self, tagged_text): + # Remove tags from the input string + untagged_text = self.remove_tags(tagged_text) + untagged_word_list = untagged_text.split() + self.collect_tags(tagged_text) + + # Store which word the tags come after + for tag in list(set(self.tags)): + tag_idxs = [m.start() for m in re.finditer(tag, tagged_text)] # find all occurances + for tag_idx in tag_idxs: + if tag_idx!=0: + substring = tagged_text[:tag_idx] + if(substring[-1]==' '): + substring = substring[:-1] + untagged_substring = self.remove_tags(substring) + prev_word_idx = untagged_substring.count(' ') + 1 + + if tag not in self.tag_follow_indices: + self.tag_follow_indices[tag] = [prev_word_idx] + else: + self.tag_follow_indices[tag].append(prev_word_idx) + else: + if tag not in self.tag_follow_indices: + self.tag_follow_indices[tag] = [0] + else: + self.tag_follow_indices[tag].append(0) + + # Fetch meta info about speech from AWS using boto3 + response = self.client.synthesize_speech( + OutputFormat='json', + SpeechMarkTypes=['viseme','word'], + Text=untagged_text, + VoiceId=self.voice) + + # Unpack meta info json to an unsorted list of dictionaries + s = [] + if "AudioStream" in response: + with closing(response["AudioStream"]) as stream: + data = stream.read() + + s = data.split('\n') + s = [json.loads(line) for line in s if line != ''] + else: + print("Could not stream audio") + + return untagged_text, s + + def phrase_to_file(self, tagged_text, output_file_loc): + + # Remove tags from the input string + untagged_text, s = obj.extract_behaviors(tagged_text) + + # Fetch audio for speech from AWS using boto3 + spoken_text = self.client.synthesize_speech( + OutputFormat='mp3', + Text=untagged_text, + VoiceId=self.voice) + + # Write audio to a file + with open(output_file_loc,'wb') as f: + f.write(spoken_text['AudioStream'].read()) + f.close() + + b = { + 'text': untagged_text, + 'file': os.getcwd() + '/' + output_file_loc, + 'behaviors': s + } + + return b + + def say(self, untagged_text, wait=False, interrupt=True): + + response = self.client.synthesize_speech( + OutputFormat='ogg_vorbis', + Text=untagged_text, + VoiceId=self.voice) + + with tempfile.TemporaryFile() as f: + if "AudioStream" in response: + with closing(response["AudioStream"]) as stream: + try: + f.write(stream.read()) + except IOError as error: + print(error) + sys.exit(-1) + + else: + print("Could not stream audio") + sys.exit(-1) + + f.seek(0) + + if not pygame.mixer.get_init(): + pygame.mixer.init() + else: + if interrupt: + pygame.mixer.stop() + channel = pygame.mixer.Channel(5) + channel.set_volume(1.0) + sound = pygame.mixer.Sound(f) + channel.play(sound) + + if wait: + while channel.get_busy(): + pass + return -1 + + + return sound.get_length() + + def is_speaking(self): + # Returns whether or not audio is being played + return mixer.music.get_busy() + +if __name__ == '__main__': + tagged_string = "Hello ! How are you?" + print(tagged_string) + obj = TextToSpeech(voice='Kimberly') + b = obj.phrase_to_file(tagged_string, 'data/out.mp3') + obj.say(b['text'], wait=True, interrupt=False) \ No newline at end of file From 91fd12a21b2dd83caac46bbdfbd22a5e3c3208ea Mon Sep 17 00:00:00 2001 From: "Moe @ moe1" Date: Fri, 26 Apr 2019 17:18:10 -0500 Subject: [PATCH 23/36] speech interruption functions added --- .../src/hlpr_dialogue_production/AWS_text2speech.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index d895929..7d732fb 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -152,11 +152,15 @@ def say(self, untagged_text, wait=False, interrupt=True): def is_speaking(self): # Returns whether or not audio is being played - return mixer.music.get_busy() + return not pygame.mixer.get_init() or pygame.mixer.Channel(5).get_busy() + + def shutup(self): + if pygame.mixer.get_init(): + pygame.mixer.stop() if __name__ == '__main__': tagged_string = "Hello ! How are you?" print(tagged_string) obj = TextToSpeech(voice='Kimberly') b = obj.phrase_to_file(tagged_string, 'data/out.mp3') - obj.say(b['text'], wait=True, interrupt=False) \ No newline at end of file + obj.say(b['text'], wait=True, interrupt=False) From f6ffc79065ee86bc76c641e99118bf0e234fb371 Mon Sep 17 00:00:00 2001 From: "Moe @ moe1" Date: Fri, 26 Apr 2019 17:51:29 -0500 Subject: [PATCH 24/36] separating file name and directory path as different arguments --- .../src/hlpr_dialogue_production/AWS_text2speech.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 7d732fb..43ce92a 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -83,10 +83,11 @@ def extract_behaviors(self, tagged_text): s = [json.loads(line) for line in s if line != ''] else: print("Could not stream audio") + return untagged_text, s - def phrase_to_file(self, tagged_text, output_file_loc): + def phrase_to_file(self, name, tagged_text, output_dir): # Remove tags from the input string untagged_text, s = obj.extract_behaviors(tagged_text) @@ -102,9 +103,12 @@ def phrase_to_file(self, tagged_text, output_file_loc): f.write(spoken_text['AudioStream'].read()) f.close() + # get absolute dir path + output_dir_path = os.path.abspath(os.path.expanduser(output_dir)) + b = { - 'text': untagged_text, - 'file': os.getcwd() + '/' + output_file_loc, + 'text': '"'+untagged_text+'"', + 'file': output_dir_path + '/' + name + '.ogg', 'behaviors': s } @@ -162,5 +166,5 @@ def shutup(self): tagged_string = "Hello ! How are you?" print(tagged_string) obj = TextToSpeech(voice='Kimberly') - b = obj.phrase_to_file(tagged_string, 'data/out.mp3') + b = obj.phrase_to_file('out',tagged_string, 'data/') obj.say(b['text'], wait=True, interrupt=False) From c0e78184816f5427d16dde636db338e3ef2a584e Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 17 May 2019 14:50:58 -0500 Subject: [PATCH 25/36] Reorganizing meta info from AWS --- .../AWS_text2speech.py | 198 ++++++++++++++++-- 1 file changed, 178 insertions(+), 20 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 43ce92a..c0d0ac9 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -9,6 +9,7 @@ import os from contextlib import closing import io +from botocore.exceptions import BotoCoreError, ClientError class TextToSpeech(): def __init__(self, voice='Kimberly'): @@ -16,6 +17,7 @@ def __init__(self, voice='Kimberly'): self.tags = [] self.client = boto3.client('polly') self.voice = voice + self.actions = [] def collect_tags(self, tagged_text): self.tags = re.findall(r'<.+?>',tagged_text) @@ -44,17 +46,19 @@ def extract_behaviors(self, tagged_text): untagged_text = self.remove_tags(tagged_text) untagged_word_list = untagged_text.split() self.collect_tags(tagged_text) + print(self.tags) # Store which word the tags come after for tag in list(set(self.tags)): tag_idxs = [m.start() for m in re.finditer(tag, tagged_text)] # find all occurances for tag_idx in tag_idxs: + print(tag_idx) if tag_idx!=0: substring = tagged_text[:tag_idx] if(substring[-1]==' '): substring = substring[:-1] untagged_substring = self.remove_tags(substring) - prev_word_idx = untagged_substring.count(' ') + 1 + prev_word_idx = substring.count(' ') + 1 if tag not in self.tag_follow_indices: self.tag_follow_indices[tag] = [prev_word_idx] @@ -66,26 +70,180 @@ def extract_behaviors(self, tagged_text): else: self.tag_follow_indices[tag].append(0) + print(self.tag_follow_indices) + for t in self.tag_follow_indices: + for idx in self.tag_follow_indices[t]: + args = t.strip("<>").split() + act = args.pop(0) + self.actions.append([idx, act, args]) + print(self.actions) + + # Fetch meta info about speech from AWS using boto3 - response = self.client.synthesize_speech( + try: + response = self.client.synthesize_speech( OutputFormat='json', SpeechMarkTypes=['viseme','word'], Text=untagged_text, VoiceId=self.voice) + except (BotoCoreError, ClientError) as error: + print(error) + sys.exit(-1) # Unpack meta info json to an unsorted list of dictionaries s = [] if "AudioStream" in response: with closing(response["AudioStream"]) as stream: - data = stream.read() + data = stream.read() - s = data.split('\n') - s = [json.loads(line) for line in s if line != ''] + s = data.split('\n') + s = [json.loads(line) for line in s if line != ''] else: print("Could not stream audio") - + sys.exit(-1) + + word_times = filter(lambda l: l["type"]=="word", s) # Start edits + for a in self.actions: + if a[0] > len(word_times)-1: + a[0] = s[-1]["time"] / 1000. # convert ms to seconds + else: + a[0] = (word_times[a[0]]["time"]) / 1000. # convert ms to seconds + + + data=[] + for a in self.actions: + args = a[2] + data.append({"start":float(a[0]), + "type":"action", + "args":args, + "id": a[1]}) # End edits + + + vis_transl = {"p": "M_B_P", + "t": "N_NG_D_Z", + "S": "CH_SH_ZH", + "T": "N_NG_D_Z", + "f": "M_B_P", + "k": "AA_AH", + "i": "EY", + "r": "R_ER", + "s": "N_NG_D_Z", + "u": "CH_SH_ZH", + "@": "AA_AH", + "a": "AA_AH", + "e": "EY", + "E": "EH_AE_AY", + "i": "EY", + "o": "AO_AW", + "O": "AA_AH", + "u": "AO_AW", + "sil": "IDLE"} + + visemes = map(lambda l: [l["time"],vis_transl[l["value"]]], filter(lambda l: l["type"]=="viseme",s)) + for v in visemes: + data.append({"start":float(v[0]) / 1000., # convert ms to seconds + "type":"viseme", + "id": v[1]}) + + return untagged_text, data + + + def extract_behaviors_old(self,line): + vis_transl = {"p": "M_B_P", + "t": "N_NG_D_Z", + "S": "CH_SH_ZH", + "T": "N_NG_D_Z", + "f": "M_B_P", + "k": "AA_AH", + "i": "EY", + "r": "R_ER", + "s": "N_NG_D_Z", + "u": "CH_SH_ZH", + "@": "AA_AH", + "a": "AA_AH", + "e": "EY", + "E": "EH_AE_AY", + "i": "EY", + "o": "AO_AW", + "O": "AA_AH", + "u": "AO_AW", + "sil": "IDLE"} + + + tokens = re.split("(<[^<>]*>)", line) + print('tokens: ',tokens) + phrase = "".join(filter(lambda s: ">" not in s, tokens)) + print('phrase: ',phrase) + + def cond_split(s): + if len(s)>=2 and s[-1]==">" and s[0]=="<": + return [s] + else: + return re.split("\s+",s) + + + tokens = map(lambda s: cond_split(s), tokens) + words = [] + + for t in tokens: + words += filter(lambda s: len(s) > 0, t) + + actions = [] + i = 0 + for w in words: + if re.match("<.*>", w): + args = w.strip("<>").split() + name = args.pop(0) + actions.append([i,name,args]) + else: + i += 1 + + print('actions: ', actions) - return untagged_text, s + try: + response = self.client.synthesize_speech(Text=phrase, OutputFormat="json", + VoiceId=self.voice, SpeechMarkTypes =["viseme", "word"]) + except (BotoCoreError, ClientError) as error: + print(error) + sys.exit(-1) + + s = [] + if "AudioStream" in response: + with closing(response["AudioStream"]) as stream: + data = stream.read() + s = data.split('\n') + s = [json.loads(line) for line in s if line != ''] + else: + print("Could not stream audio") + sys.exit(-1) + + word_times = filter(lambda l: l["type"]=="word", s) # Start edits + for a in actions: + if a[0] > len(word_times)-1: + a[0] = s[-1]["time"] / 1000. # convert ms to seconds + else: + a[0] = (word_times[a[0]]["time"]) / 1000. # convert ms to seconds + + + data=[] + for a in actions: + args = a[2] + data.append({"start":float(a[0]), + "type":"action", + "args":args, + "id": a[1]}) # End edits + + visemes = map(lambda l: [l["time"],vis_transl[l["value"]]], filter(lambda l: l["type"]=="viseme",s)) + for v in visemes: + data.append({"start":float(v[0]) / 1000., # convert ms to seconds + "type":"viseme", + "id": v[1]}) + + + print('phrase: ',phrase) + print('data:' ,data) + + return phrase, data def phrase_to_file(self, name, tagged_text, output_dir): @@ -96,22 +254,22 @@ def phrase_to_file(self, name, tagged_text, output_dir): spoken_text = self.client.synthesize_speech( OutputFormat='mp3', Text=untagged_text, - VoiceId=self.voice) - - # Write audio to a file - with open(output_file_loc,'wb') as f: - f.write(spoken_text['AudioStream'].read()) - f.close() + VoiceId=self.voice) # get absolute dir path output_dir_path = os.path.abspath(os.path.expanduser(output_dir)) b = { - 'text': '"'+untagged_text+'"', - 'file': output_dir_path + '/' + name + '.ogg', - 'behaviors': s + 'text': '"'+untagged_text+'"', + 'file': output_dir_path + '/' + name + '.ogg', + 'behaviors': s } + # Write audio to a file + with open(b['file'],'wb') as f: + f.write(spoken_text['AudioStream'].read()) + f.close() + return b def say(self, untagged_text, wait=False, interrupt=True): @@ -156,15 +314,15 @@ def say(self, untagged_text, wait=False, interrupt=True): def is_speaking(self): # Returns whether or not audio is being played - return not pygame.mixer.get_init() or pygame.mixer.Channel(5).get_busy() + return not pygame.mixer.get_init() or pygame.mixer.Channel(5).get_busy() - def shutup(self): - if pygame.mixer.get_init(): + def shutup(self): + if pygame.mixer.get_init(): pygame.mixer.stop() if __name__ == '__main__': tagged_string = "Hello ! How are you?" print(tagged_string) obj = TextToSpeech(voice='Kimberly') - b = obj.phrase_to_file('out',tagged_string, 'data/') + b = obj.phrase_to_file('out',tagged_string, '../../data/') obj.say(b['text'], wait=True, interrupt=False) From bbb960e35016e566806797fd40a9f3f5e7602048 Mon Sep 17 00:00:00 2001 From: lupe Date: Fri, 17 May 2019 16:03:27 -0500 Subject: [PATCH 26/36] fixed compatibility w/ dialogue production --- .../AWS_text2speech.py | 119 ++++++++---------- 1 file changed, 50 insertions(+), 69 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index c0d0ac9..073072c 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -18,7 +18,7 @@ def __init__(self, voice='Kimberly'): self.client = boto3.client('polly') self.voice = voice self.actions = [] - + def collect_tags(self, tagged_text): self.tags = re.findall(r'<.+?>',tagged_text) @@ -35,10 +35,10 @@ def remove_tags(self, tagged_text): for i in range(len(open_brackets_idx)): if(open_brackets_idx[i]!=0): untagged_text = untagged_text + tagged_text[pointer:open_brackets_idx[i]-1] - pointer = close_brackets_idx[i]+1 + pointer = close_brackets_idx[i]+1 if(pointer!=len(tagged_text)): untagged_text = untagged_text + tagged_text[pointer:] - + return untagged_text def extract_behaviors(self, tagged_text): @@ -57,9 +57,9 @@ def extract_behaviors(self, tagged_text): substring = tagged_text[:tag_idx] if(substring[-1]==' '): substring = substring[:-1] - untagged_substring = self.remove_tags(substring) - prev_word_idx = substring.count(' ') + 1 - + untagged_substring = self.remove_tags(substring) + prev_word_idx = substring.count(' ') + 1 + if tag not in self.tag_follow_indices: self.tag_follow_indices[tag] = [prev_word_idx] else: @@ -76,7 +76,7 @@ def extract_behaviors(self, tagged_text): args = t.strip("<>").split() act = args.pop(0) self.actions.append([idx, act, args]) - print(self.actions) + print(self.actions) # Fetch meta info about speech from AWS using boto3 @@ -89,7 +89,7 @@ def extract_behaviors(self, tagged_text): except (BotoCoreError, ClientError) as error: print(error) sys.exit(-1) - + # Unpack meta info json to an unsorted list of dictionaries s = [] if "AudioStream" in response: @@ -114,60 +114,41 @@ def extract_behaviors(self, tagged_text): for a in self.actions: args = a[2] data.append({"start":float(a[0]), - "type":"action", - "args":args, - "id": a[1]}) # End edits - + "type":a[1], + "args":args, + "id": a[1]}) # End edits - vis_transl = {"p": "M_B_P", - "t": "N_NG_D_Z", - "S": "CH_SH_ZH", - "T": "N_NG_D_Z", - "f": "M_B_P", - "k": "AA_AH", - "i": "EY", - "r": "R_ER", - "s": "N_NG_D_Z", - "u": "CH_SH_ZH", - "@": "AA_AH", - "a": "AA_AH", - "e": "EY", - "E": "EH_AE_AY", - "i": "EY", - "o": "AO_AW", - "O": "AA_AH", - "u": "AO_AW", - "sil": "IDLE"} - visemes = map(lambda l: [l["time"],vis_transl[l["value"]]], filter(lambda l: l["type"]=="viseme",s)) + visemes = map(lambda l: [l["time"],l["value"]], filter(lambda l: l["type"]=="viseme",s)) for v in visemes: - data.append({"start":float(v[0]) / 1000., # convert ms to seconds - "type":"viseme", - "id": v[1]}) + data.append({"start":float(v[0]) / 1000., # convert ms to seconds + "type":"viseme", + "args":"", + "id": v[1]}) return untagged_text, data def extract_behaviors_old(self,line): vis_transl = {"p": "M_B_P", - "t": "N_NG_D_Z", - "S": "CH_SH_ZH", - "T": "N_NG_D_Z", - "f": "M_B_P", - "k": "AA_AH", - "i": "EY", - "r": "R_ER", - "s": "N_NG_D_Z", - "u": "CH_SH_ZH", - "@": "AA_AH", - "a": "AA_AH", - "e": "EY", - "E": "EH_AE_AY", - "i": "EY", - "o": "AO_AW", - "O": "AA_AH", - "u": "AO_AW", - "sil": "IDLE"} + "t": "N_NG_D_Z", + "S": "CH_SH_ZH", + "T": "N_NG_D_Z", + "f": "M_B_P", + "k": "AA_AH", + "i": "EY", + "r": "R_ER", + "s": "N_NG_D_Z", + "u": "CH_SH_ZH", + "@": "AA_AH", + "a": "AA_AH", + "e": "EY", + "E": "EH_AE_AY", + "i": "EY", + "o": "AO_AW", + "O": "AA_AH", + "u": "AO_AW", + "sil": "IDLE"} tokens = re.split("(<[^<>]*>)", line) @@ -202,7 +183,7 @@ def cond_split(s): try: response = self.client.synthesize_speech(Text=phrase, OutputFormat="json", - VoiceId=self.voice, SpeechMarkTypes =["viseme", "word"]) + VoiceId=self.voice, SpeechMarkTypes =["viseme", "word"]) except (BotoCoreError, ClientError) as error: print(error) sys.exit(-1) @@ -229,15 +210,15 @@ def cond_split(s): for a in actions: args = a[2] data.append({"start":float(a[0]), - "type":"action", - "args":args, - "id": a[1]}) # End edits + "type":"action", + "args":args, + "id": a[1]}) # End edits visemes = map(lambda l: [l["time"],vis_transl[l["value"]]], filter(lambda l: l["type"]=="viseme",s)) for v in visemes: data.append({"start":float(v[0]) / 1000., # convert ms to seconds - "type":"viseme", - "id": v[1]}) + "type":"viseme", + "id": v[1]}) print('phrase: ',phrase) @@ -252,9 +233,9 @@ def phrase_to_file(self, name, tagged_text, output_dir): # Fetch audio for speech from AWS using boto3 spoken_text = self.client.synthesize_speech( - OutputFormat='mp3', - Text=untagged_text, - VoiceId=self.voice) + OutputFormat='mp3', + Text=untagged_text, + VoiceId=self.voice) # get absolute dir path output_dir_path = os.path.abspath(os.path.expanduser(output_dir)) @@ -275,9 +256,9 @@ def phrase_to_file(self, name, tagged_text, output_dir): def say(self, untagged_text, wait=False, interrupt=True): response = self.client.synthesize_speech( - OutputFormat='ogg_vorbis', - Text=untagged_text, - VoiceId=self.voice) + OutputFormat='ogg_vorbis', + Text=untagged_text, + VoiceId=self.voice) with tempfile.TemporaryFile() as f: if "AudioStream" in response: @@ -299,10 +280,10 @@ def say(self, untagged_text, wait=False, interrupt=True): else: if interrupt: pygame.mixer.stop() - channel = pygame.mixer.Channel(5) - channel.set_volume(1.0) - sound = pygame.mixer.Sound(f) - channel.play(sound) + channel = pygame.mixer.Channel(5) + channel.set_volume(1.0) + sound = pygame.mixer.Sound(f) + channel.play(sound) if wait: while channel.get_busy(): From 6992e568f5027fac9da771650e654482eead15e4 Mon Sep 17 00:00:00 2001 From: lupe Date: Fri, 17 May 2019 16:12:31 -0500 Subject: [PATCH 27/36] fixed gnarly indentation --- .../AWS_text2speech.py | 115 ++---------------- 1 file changed, 9 insertions(+), 106 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 073072c..78dbd65 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -35,7 +35,7 @@ def remove_tags(self, tagged_text): for i in range(len(open_brackets_idx)): if(open_brackets_idx[i]!=0): untagged_text = untagged_text + tagged_text[pointer:open_brackets_idx[i]-1] - pointer = close_brackets_idx[i]+1 + pointer = close_brackets_idx[i]+1 if(pointer!=len(tagged_text)): untagged_text = untagged_text + tagged_text[pointer:] @@ -57,8 +57,8 @@ def extract_behaviors(self, tagged_text): substring = tagged_text[:tag_idx] if(substring[-1]==' '): substring = substring[:-1] - untagged_substring = self.remove_tags(substring) - prev_word_idx = substring.count(' ') + 1 + untagged_substring = self.remove_tags(substring) + prev_word_idx = substring.count(' ') + 1 if tag not in self.tag_follow_indices: self.tag_follow_indices[tag] = [prev_word_idx] @@ -76,7 +76,7 @@ def extract_behaviors(self, tagged_text): args = t.strip("<>").split() act = args.pop(0) self.actions.append([idx, act, args]) - print(self.actions) + print(self.actions) # Fetch meta info about speech from AWS using boto3 @@ -129,103 +129,6 @@ def extract_behaviors(self, tagged_text): return untagged_text, data - def extract_behaviors_old(self,line): - vis_transl = {"p": "M_B_P", - "t": "N_NG_D_Z", - "S": "CH_SH_ZH", - "T": "N_NG_D_Z", - "f": "M_B_P", - "k": "AA_AH", - "i": "EY", - "r": "R_ER", - "s": "N_NG_D_Z", - "u": "CH_SH_ZH", - "@": "AA_AH", - "a": "AA_AH", - "e": "EY", - "E": "EH_AE_AY", - "i": "EY", - "o": "AO_AW", - "O": "AA_AH", - "u": "AO_AW", - "sil": "IDLE"} - - - tokens = re.split("(<[^<>]*>)", line) - print('tokens: ',tokens) - phrase = "".join(filter(lambda s: ">" not in s, tokens)) - print('phrase: ',phrase) - - def cond_split(s): - if len(s)>=2 and s[-1]==">" and s[0]=="<": - return [s] - else: - return re.split("\s+",s) - - - tokens = map(lambda s: cond_split(s), tokens) - words = [] - - for t in tokens: - words += filter(lambda s: len(s) > 0, t) - - actions = [] - i = 0 - for w in words: - if re.match("<.*>", w): - args = w.strip("<>").split() - name = args.pop(0) - actions.append([i,name,args]) - else: - i += 1 - - print('actions: ', actions) - - try: - response = self.client.synthesize_speech(Text=phrase, OutputFormat="json", - VoiceId=self.voice, SpeechMarkTypes =["viseme", "word"]) - except (BotoCoreError, ClientError) as error: - print(error) - sys.exit(-1) - - s = [] - if "AudioStream" in response: - with closing(response["AudioStream"]) as stream: - data = stream.read() - s = data.split('\n') - s = [json.loads(line) for line in s if line != ''] - else: - print("Could not stream audio") - sys.exit(-1) - - word_times = filter(lambda l: l["type"]=="word", s) # Start edits - for a in actions: - if a[0] > len(word_times)-1: - a[0] = s[-1]["time"] / 1000. # convert ms to seconds - else: - a[0] = (word_times[a[0]]["time"]) / 1000. # convert ms to seconds - - - data=[] - for a in actions: - args = a[2] - data.append({"start":float(a[0]), - "type":"action", - "args":args, - "id": a[1]}) # End edits - - visemes = map(lambda l: [l["time"],vis_transl[l["value"]]], filter(lambda l: l["type"]=="viseme",s)) - for v in visemes: - data.append({"start":float(v[0]) / 1000., # convert ms to seconds - "type":"viseme", - "id": v[1]}) - - - print('phrase: ',phrase) - print('data:' ,data) - - return phrase, data - def phrase_to_file(self, name, tagged_text, output_dir): # Remove tags from the input string @@ -278,12 +181,12 @@ def say(self, untagged_text, wait=False, interrupt=True): if not pygame.mixer.get_init(): pygame.mixer.init() else: - if interrupt: + if interrupt: pygame.mixer.stop() - channel = pygame.mixer.Channel(5) - channel.set_volume(1.0) - sound = pygame.mixer.Sound(f) - channel.play(sound) + channel = pygame.mixer.Channel(5) + channel.set_volume(1.0) + sound = pygame.mixer.Sound(f) + channel.play(sound) if wait: while channel.get_busy(): From e2ee0fb84339c19e2cba0c897400fb66378d3ea4 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 17 May 2019 17:04:21 -0500 Subject: [PATCH 28/36] adding support for polly tags --- .../AWS_text2speech.py | 56 +++++++++++++++---- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 78dbd65..3120a6c 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -18,9 +18,29 @@ def __init__(self, voice='Kimberly'): self.client = boto3.client('polly') self.voice = voice self.actions = [] + self.polly_tags = [ + 'break', # adding a pause + 'emphasis', # emphasizing words + 'lang', # specify another language for specific words + 'mark', # placing a custom tag in your text + 'p', # adding a pause between paragraphs + 'phoneme', # using phonetic pronunciation + 'prosody', # controlling volume, speaking rate and pitch + 'prosody amazon:max-duration', # setting a maximum duration for synthesized speech + 's', # adding a pause between sentences + 'say-as', # controlling how special types of words are spoken + 'speak', # identifying SSML-Enhanced text + 'sub', # pronouncing acronyms and abbreviations + 'w', # improving pronunciation by specifying parts of speech + 'amazon:auto-breaths', # adding the sound of breathing + 'amazon:effect name=\"drc\"', #adding dynamic range compression + 'amazon:effect phonation=\"soft\"', # speaking softly + 'amazon:effect vocal-tract-length', # controlling timbre + 'amazon: effect name=\"whispered\"' # whispering + ] - def collect_tags(self, tagged_text): - self.tags = re.findall(r'<.+?>',tagged_text) + # def collect_tags(self, tagged_text): + # self.tags = re.findall(r'<.+?>',tagged_text) def remove_tags(self, tagged_text): untagged_text = '' @@ -33,8 +53,22 @@ def remove_tags(self, tagged_text): pointer = 0 for i in range(len(open_brackets_idx)): + retain = '' + tag = tagged_text[open_brackets_idx[i]:close_brackets_idx[i]+1] + + # keep the tags from amazon polly as part of untagged_text string + if any(pt for pt in self.polly_tags if ('<'+pt+' ' in tag) or ('<'+pt+'>' in tag) or ('").split() act = args.pop(0) self.actions.append([idx, act, args]) - print(self.actions) + # print(self.actions) # Fetch meta info about speech from AWS using boto3 @@ -181,7 +217,7 @@ def say(self, untagged_text, wait=False, interrupt=True): if not pygame.mixer.get_init(): pygame.mixer.init() else: - if interrupt: + if interrupt: pygame.mixer.stop() channel = pygame.mixer.Channel(5) channel.set_volume(1.0) @@ -205,7 +241,7 @@ def shutup(self): pygame.mixer.stop() if __name__ == '__main__': - tagged_string = "Hello ! How are you?" + tagged_string = "Hello ! How are you? hello again! " print(tagged_string) obj = TextToSpeech(voice='Kimberly') b = obj.phrase_to_file('out',tagged_string, '../../data/') From 0ce3dd982af0b23bef5cba411d94d16dda92d930 Mon Sep 17 00:00:00 2001 From: lupe Date: Fri, 17 May 2019 17:26:41 -0500 Subject: [PATCH 29/36] cleanup to actually work --- .../AWS_text2speech.py | 24 ++++++++++++------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 3120a6c..2be8657 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -33,10 +33,12 @@ def __init__(self, voice='Kimberly'): 'sub', # pronouncing acronyms and abbreviations 'w', # improving pronunciation by specifying parts of speech 'amazon:auto-breaths', # adding the sound of breathing - 'amazon:effect name=\"drc\"', #adding dynamic range compression - 'amazon:effect phonation=\"soft\"', # speaking softly - 'amazon:effect vocal-tract-length', # controlling timbre - 'amazon: effect name=\"whispered\"' # whispering + 'amazon:effect', + #'amazon:effect name=\"drc\"', #adding dynamic range compression + #'amazon:effect phonation=\"soft\"', # speaking softly + #'amazon:effect vocal-tract-length', # controlling timbre + #'amazon:effect name=\"whispered\"' # whispering + 'amazon:breath' # breathing ] # def collect_tags(self, tagged_text): @@ -55,16 +57,19 @@ def remove_tags(self, tagged_text): for i in range(len(open_brackets_idx)): retain = '' tag = tagged_text[open_brackets_idx[i]:close_brackets_idx[i]+1] - + print tag # keep the tags from amazon polly as part of untagged_text string if any(pt for pt in self.polly_tags if ('<'+pt+' ' in tag) or ('<'+pt+'>' in tag) or ('{}".format(untagged_text) def extract_behaviors(self, tagged_text): # Remove tags from the input string @@ -121,6 +126,7 @@ def extract_behaviors(self, tagged_text): OutputFormat='json', SpeechMarkTypes=['viseme','word'], Text=untagged_text, + TextType="ssml", VoiceId=self.voice) except (BotoCoreError, ClientError) as error: print(error) @@ -174,6 +180,7 @@ def phrase_to_file(self, name, tagged_text, output_dir): spoken_text = self.client.synthesize_speech( OutputFormat='mp3', Text=untagged_text, + TextType="ssml", VoiceId=self.voice) # get absolute dir path @@ -197,6 +204,7 @@ def say(self, untagged_text, wait=False, interrupt=True): response = self.client.synthesize_speech( OutputFormat='ogg_vorbis', Text=untagged_text, + TextType="ssml", VoiceId=self.voice) with tempfile.TemporaryFile() as f: From ce0e2c207659a1c016652ec2d87c79f6ca5de633 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 17 May 2019 17:30:44 -0500 Subject: [PATCH 30/36] cleanup --- .../AWS_text2speech.py | 21 ++++--------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 2be8657..dc0cd2e 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -33,16 +33,14 @@ def __init__(self, voice='Kimberly'): 'sub', # pronouncing acronyms and abbreviations 'w', # improving pronunciation by specifying parts of speech 'amazon:auto-breaths', # adding the sound of breathing - 'amazon:effect', - #'amazon:effect name=\"drc\"', #adding dynamic range compression + 'amazon:effect', + #'amazon:effect name=\"drc\"', #adding dynamic range compression #'amazon:effect phonation=\"soft\"', # speaking softly #'amazon:effect vocal-tract-length', # controlling timbre #'amazon:effect name=\"whispered\"' # whispering 'amazon:breath' # breathing ] - # def collect_tags(self, tagged_text): - # self.tags = re.findall(r'<.+?>',tagged_text) def remove_tags(self, tagged_text): untagged_text = '' @@ -57,15 +55,13 @@ def remove_tags(self, tagged_text): for i in range(len(open_brackets_idx)): retain = '' tag = tagged_text[open_brackets_idx[i]:close_brackets_idx[i]+1] - print tag + # keep the tags from amazon polly as part of untagged_text string if any(pt for pt in self.polly_tags if ('<'+pt+' ' in tag) or ('<'+pt+'>' in tag) or ('").split() act = args.pop(0) self.actions.append([idx, act, args]) - # print(self.actions) # Fetch meta info about speech from AWS using boto3 @@ -151,7 +139,6 @@ def extract_behaviors(self, tagged_text): else: a[0] = (word_times[a[0]]["time"]) / 1000. # convert ms to seconds - data=[] for a in self.actions: args = a[2] From 6b73997d3d85f4d289fe01d919a7b62f1b008f9f Mon Sep 17 00:00:00 2001 From: lupe Date: Fri, 17 May 2019 17:55:54 -0500 Subject: [PATCH 31/36] tts working on lupe, need to check on moe --- .../AWS_text2speech.py | 26 +++++++++++-------- .../hlpr_dialogue_production/controllers.py | 4 +-- .../src/hlpr_dialogue_production/dialogue.py | 10 +++---- .../viseme_action_server.py | 1 + 4 files changed, 23 insertions(+), 18 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index dc0cd2e..d223b01 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -118,8 +118,8 @@ def extract_behaviors(self, tagged_text): VoiceId=self.voice) except (BotoCoreError, ClientError) as error: print(error) - sys.exit(-1) - + response = "" + # Unpack meta info json to an unsorted list of dictionaries s = [] if "AudioStream" in response: @@ -130,7 +130,7 @@ def extract_behaviors(self, tagged_text): s = [json.loads(line) for line in s if line != ''] else: print("Could not stream audio") - sys.exit(-1) + return untagged_text, [] word_times = filter(lambda l: l["type"]=="word", s) # Start edits for a in self.actions: @@ -188,12 +188,16 @@ def phrase_to_file(self, name, tagged_text, output_dir): def say(self, untagged_text, wait=False, interrupt=True): - response = self.client.synthesize_speech( - OutputFormat='ogg_vorbis', - Text=untagged_text, - TextType="ssml", - VoiceId=self.voice) - + try: + response = self.client.synthesize_speech( + OutputFormat='ogg_vorbis', + Text=untagged_text, + TextType="ssml", + VoiceId=self.voice) + except: + print "Error synthesizing speech" + return 0 + with tempfile.TemporaryFile() as f: if "AudioStream" in response: with closing(response["AudioStream"]) as stream: @@ -201,11 +205,11 @@ def say(self, untagged_text, wait=False, interrupt=True): f.write(stream.read()) except IOError as error: print(error) - sys.exit(-1) + else: print("Could not stream audio") - sys.exit(-1) + return f.seek(0) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py index b761878..2e1501b 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/controllers.py @@ -250,7 +250,7 @@ def viseme_controller_cb(behavior_name, string_args): Viseme goal containing the name of the viseme """ - return dialogue_msgs.VisemeGoal(viseme=string_args) + return dialogue_msgs.VisemeGoal(viseme=behavior_name) def get_viseme_controller(): """ Sets up the viseme controller state @@ -261,7 +261,7 @@ def get_viseme_controller(): """ - time_adj = {"viseme":0.2} + time_adj = {"viseme":0.0} behaviors=time_adj.keys() diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index 58e33aa..d3b6b05 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -37,7 +37,7 @@ import actionlib import contextlib from sound_play.libsoundplay import SoundClient -from cordial_tts.cordial_tts import CoRDialTTS +from AWS_text2speech import TextToSpeech class Synchronizer(): """ Object that can be passed to all controllers to synchronize their start @@ -160,7 +160,7 @@ def execute(self,userdata): rospy.logwarn("Controller {} got empty behavior list".format(self.name)) return "done" - ordered_behaviors = filter(lambda b: b["id"] in self._can_handle, + ordered_behaviors = filter(lambda b: b["type"] in self._can_handle, userdata.ordered_behaviors) while not (self._sync!=None and self._sync.started) and not self.preempt_requested(): @@ -240,7 +240,7 @@ def __init__(self,voice="Kimberly"): smach.State.__init__(self,outcomes=["done"], input_keys=["marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) + self._tts = TextToSpeech(voice) def execute(self,userdata): text, behaviors = self._tts.extract_behaviors(userdata.marked_text) @@ -298,7 +298,7 @@ def __init__(self, phrases, voice="Kimberly"): smach.State.__init__(self,outcomes=["done"], input_keys=["key_or_marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) + self._tts = TextToSpeech(voice) self._phrases = phrases def execute(self,userdata): @@ -570,7 +570,7 @@ def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): input_keys=["text","wav_file"]) self._tts = use_tts if use_tts: - self._talker = CoRDialTTS(voice) + self._talker = TextToSpeech(voice) self._sound_client = SoundClient() self._sync = synchronizer diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py index 3dee554..10c2c9e 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/viseme_action_server.py @@ -36,6 +36,7 @@ class LedVisemeActionServer: def __init__(self): self._as = actionlib.SimpleActionServer("HLPR_Visemes",dialogue_msgs.VisemeAction, execute_cb=self.execute_cb, auto_start=False) + rospy.wait_for_service("/led_eye") self.change_eye = rospy.ServiceProxy("/led_eye",LedEye) self.viseme_mapping = {"p": LedEyeRequest.FLAT, "t": LedEyeRequest.FLAT, From 43cad313c8fd9763074b781e8083f7b171b65dbf Mon Sep 17 00:00:00 2001 From: "Moe @ moe1" Date: Fri, 2 Aug 2019 15:31:24 -0500 Subject: [PATCH 32/36] Changes by Elaine on moe --- .../AWS_text2speech.py | 28 +++++++++++------- .../src/hlpr_dialogue_production/dialogue.py | 12 +++++--- .../test_action_client.py | 29 ++++++++++--------- 3 files changed, 42 insertions(+), 27 deletions(-) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py index 43ce92a..4193e56 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/AWS_text2speech.py @@ -74,18 +74,26 @@ def extract_behaviors(self, tagged_text): VoiceId=self.voice) # Unpack meta info json to an unsorted list of dictionaries - s = [] + output_data = [] if "AudioStream" in response: with closing(response["AudioStream"]) as stream: - data = stream.read() - - s = data.split('\n') - s = [json.loads(line) for line in s if line != ''] + data = stream.read() + + s = data.split('\n') + s = [json.loads(line) for line in s if line != ''] + output_data = map(lambda l: + { + "id": "viseme", + "start":float(l["time"]) / 1000, + "args": l["value"] + } + , filter(lambda l: l["type"]=="viseme",s)) else: print("Could not stream audio") + print(output_data) - return untagged_text, s + return untagged_text, output_data def phrase_to_file(self, name, tagged_text, output_dir): @@ -156,11 +164,11 @@ def say(self, untagged_text, wait=False, interrupt=True): def is_speaking(self): # Returns whether or not audio is being played - return not pygame.mixer.get_init() or pygame.mixer.Channel(5).get_busy() + return not pygame.mixer.get_init() or pygame.mixer.Channel(5).get_busy() - def shutup(self): - if pygame.mixer.get_init(): - pygame.mixer.stop() + def shutup(self): + if pygame.mixer.get_init(): + pygame.mixer.stop() if __name__ == '__main__': tagged_string = "Hello ! How are you?" diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py index 58e33aa..f0432a4 100644 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/dialogue.py @@ -38,6 +38,7 @@ import contextlib from sound_play.libsoundplay import SoundClient from cordial_tts.cordial_tts import CoRDialTTS +from AWS_text2speech import TextToSpeech class Synchronizer(): """ Object that can be passed to all controllers to synchronize their start @@ -240,7 +241,8 @@ def __init__(self,voice="Kimberly"): smach.State.__init__(self,outcomes=["done"], input_keys=["marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) + #self._tts = CoRDialTTS(voice) + self._tts = TextToSpeech(voice) def execute(self,userdata): text, behaviors = self._tts.extract_behaviors(userdata.marked_text) @@ -298,8 +300,9 @@ def __init__(self, phrases, voice="Kimberly"): smach.State.__init__(self,outcomes=["done"], input_keys=["key_or_marked_text"], output_keys=["text","ordered_behaviors","wav_file"]) - self._tts = CoRDialTTS(voice) - self._phrases = phrases + #self._tts = CoRDialTTS(voice) + self._tts = TextToSpeech(voice) + self._phrases = phrases def execute(self,userdata): if userdata.key_or_marked_text in self._phrases: @@ -570,7 +573,8 @@ def __init__(self, use_tts, synchronizer, phrases=None, voice="Kimberly"): input_keys=["text","wav_file"]) self._tts = use_tts if use_tts: - self._talker = CoRDialTTS(voice) + #self._talker = CoRDialTTS(voice) + self._talker = TextToSpeech(voice) self._sound_client = SoundClient() self._sync = synchronizer diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py index a551336..bfc6138 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py @@ -37,17 +37,20 @@ if __name__ == "__main__": - rospy.init_node("test_action_client") - client = actionlib.SimpleActionClient("HLPR_Dialogue",dialogue_msgs.DialogueActAction) + rospy.init_node("test_action_client", disable_signals=True) + client = actionlib.SimpleActionClient("/HLPR_Dialogue",dialogue_msgs.DialogueActAction) + rospy.loginfo("waiting for server") client.wait_for_server() - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hello! My name is Moe.")) - client.wait_for_result() - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I am a robot!")) - client.wait_for_result() - client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="I was built at the Socially Intelligent Machines lab.")) #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key="Hello!")) - #text_or_key = "Hello world" - #if len(sys.argv) > 1: - # text_or_key = sys.argv[1] - #client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key=text_or_key)) - client.wait_for_result() - print client.get_result() + rospy.loginfo("got server") + while not rospy.is_shutdown(): + print("Say what?") + try: + s = raw_input() + except KeyboardInterrupt: + print("") + print("bye!") + rospy.signal_shutdown("requested by user") + sys.exit() + client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key=s)) + client.wait_for_result() + print(client.get_result()) From 4843f2131c05536b681f0296d8469c0fd633932b Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 2 Aug 2019 15:55:44 -0500 Subject: [PATCH 33/36] data folders --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index c9b568f..86dcf69 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.pyc *.swp +hlpr_dialogue_production/data/* +hlpr_speech_synthesis/src/hlpr_speech_synthesis/data/* From 0c6e256496a67b8439a0b27a6c7d518136fa3993 Mon Sep 17 00:00:00 2001 From: Akanksha Saran Date: Fri, 2 Aug 2019 16:20:49 -0500 Subject: [PATCH 34/36] Google Speech API usage for speech2text --- hlpr_speech_recognition/scripts/demo.py | 34 ++++++++++ hlpr_speech_recognition/scripts/record.py | 64 +++++++++++++++++++ .../scripts/speech2text.py | 36 +++++++++++ 3 files changed, 134 insertions(+) create mode 100644 hlpr_speech_recognition/scripts/demo.py create mode 100644 hlpr_speech_recognition/scripts/record.py create mode 100644 hlpr_speech_recognition/scripts/speech2text.py diff --git a/hlpr_speech_recognition/scripts/demo.py b/hlpr_speech_recognition/scripts/demo.py new file mode 100644 index 0000000..05d51f4 --- /dev/null +++ b/hlpr_speech_recognition/scripts/demo.py @@ -0,0 +1,34 @@ + +from record import Recorder +from speech2text import TranscribeClient +import sounddevice as sd +import argparse +import os + +DEVICE = 6 + +if __name__ == '__main__': + parser = argparse.ArgumentParser('Speech2Text demo') + parser.add_argument('-l', '--list-devices', action='store_true', help='show list of audio devices and exit') + parser.add_argument('-d', '--device', type=int, default=DEVICE, help='numeric id of input deviec') + + args = parser.parse_args() + list_devices = args.list_devices + device = args.device + + if list_devices: + print(sd.query_devices()) + else: + recorder = Recorder(device) + input('Press Enter to start recording') + record_file = recorder.record() + print('Recording...') + input('Press Enter to stop recording') + recorder.stop() + print('Recording finished.') + + transcriber = TranscribeClient() + results = transcriber.transcribe(record_file) + + print('Transcript: {}'.format(results[0])) + os.remove(record_file) diff --git a/hlpr_speech_recognition/scripts/record.py b/hlpr_speech_recognition/scripts/record.py new file mode 100644 index 0000000..0b505e9 --- /dev/null +++ b/hlpr_speech_recognition/scripts/record.py @@ -0,0 +1,64 @@ +from threading import Thread +import sounddevice as sd +import soundfile as sf +import tempfile +import argparse +import queue +import sys + +DEVICE = 6 + +class Recorder(object): + def __init__(self, device, type='flac', save_dir=''): + self.device = device + self.device_info = sd.query_devices(self.device, 'input') + self.sample_rate = int(self.device_info['default_samplerate']) + self.type = type + self.save_dir = save_dir + self.recording = False + + def _record(self, filename): + q = queue.Queue() + def callback(indata, frames, time, status): + #if status: + # print(status, file=sys.stderr) + q.put(indata.copy()) + + with sf.SoundFile(filename, mode='x', samplerate=self.sample_rate, channels=1) as f: + with sd.InputStream(samplerate=self.sample_rate, device=self.device, + channels=1, callback=callback): + while self.recording: + f.write(q.get()) + + def record(self, filename=None): + if filename is None: + filename = tempfile.mktemp(prefix='rec_', suffix='.'+self.type, dir=self.save_dir) + + self.recording = True + record_thread = Thread(target=self._record, args=(filename,)) + record_thread.start() + + return repr(filename) + + def stop(self): + self.recording = False + +if __name__ == '__main__': + parser = argparse.ArgumentParser('Record sound from microphone') + parser.add_argument('-l', '--list-devices', action='store_true', help='show list of audio decives and exit') + parser.add_argument('-d', '--device', type=int, default=DEVICE, help='numeric id of input device') + + args = parser.parse_args() + list_devices = args.list_devices + device = args.device + + if list_devices: + print(sd.query_devices()) + else: + recorder = Recorder(device) + input('Press Enter to start recording') + record_file = recorder.record() + print('Recording...') + input('Press Enter to stop recording') + recorder.stop() + print('Recording finished: ', record_file) diff --git a/hlpr_speech_recognition/scripts/speech2text.py b/hlpr_speech_recognition/scripts/speech2text.py new file mode 100644 index 0000000..dd5e90d --- /dev/null +++ b/hlpr_speech_recognition/scripts/speech2text.py @@ -0,0 +1,36 @@ +from google.cloud import speech +from google.cloud.speech import enums +from google.cloud.speech import types +import sys +import io + +class TranscribeClient(object): + def __init__(self): + self.client = speech.SpeechClient() + self.SUPPORTED_FILE_TYPES = ['flac'] + + def transcribe(self, filename): + filetype = filename.split('.')[-1].lower() + if not filetype in self.SUPPORTED_FILE_TYPES: + raise NotImplementedError('filetype not supported.') + + with io.open(filename, 'rb') as audio_file: + content = audio_file.read() + audio = types.RecognitionAudio(content=content) + + config = types.RecognitionConfig(language_code='en-US') + response = self.client.recognize(config, audio) + + results = [] + for result in response.results: + results.append(result.alternatives[0].transcript) + + return results + +if __name__ == '__main__': + filename = sys.argv[1] + transcriber = TranscribeClient() + results = transcriber.transcribe(filename) + + for result in results: + print('Transcript: {}'.format(result)) From f10697477737f223043e2e5f16b0fb3f21686349 Mon Sep 17 00:00:00 2001 From: "Moe @ moe1" Date: Fri, 9 Aug 2019 12:18:02 -0500 Subject: [PATCH 35/36] Fix queue import --- hlpr_speech_recognition/scripts/record.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hlpr_speech_recognition/scripts/record.py b/hlpr_speech_recognition/scripts/record.py index 0b505e9..da1ce63 100644 --- a/hlpr_speech_recognition/scripts/record.py +++ b/hlpr_speech_recognition/scripts/record.py @@ -3,7 +3,7 @@ import soundfile as sf import tempfile import argparse -import queue +import Queue as queue import sys DEVICE = 6 From f66c6b043a76c344f6ff1f938bb271a090a5283b Mon Sep 17 00:00:00 2001 From: lupe Date: Wed, 25 Sep 2019 11:14:47 -0500 Subject: [PATCH 36/36] Example of how to say "Lupe" properly --- .../src/hlpr_dialogue_production/test_action_client.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py index bfc6138..e3b61b8 100755 --- a/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py +++ b/hlpr_dialogue_production/src/hlpr_dialogue_production/test_action_client.py @@ -35,6 +35,9 @@ import hlpr_dialogue_production.msg as dialogue_msgs import sys +# Here's an example of how to say "Lupe" with proper emphasis: +# client.send_goal(dialogue_msgs.DialogueActGoal(text_or_key='Hi! My name is Lupay')) + if __name__ == "__main__": rospy.init_node("test_action_client", disable_signals=True)