/tags/v2-72/mh/code/common/viavoice_control.pl

# · Perl · 141 lines · 109 code · 16 blank · 16 comment · 21 complexity · cefc648d179b9ae9a9e6ad47d98cd753 MD5 · raw file

  1. # Category=Voice
  2. #@ Use this to control the ViaVoice VR engine (currently Linux only)
  3. # Don't do anything if we are using non-viavoice vr engine
  4. return unless $config_parms{voice_cmd} eq 'viavoice';
  5. # A do nothing test voice command
  6. $v_viavoice_hello = new Voice_Cmd("[hi there,how are you]");
  7. $v_viavoice_hello-> set_info('A dummy little test command');
  8. # Create the viavoice control phrases
  9. $v_viavoice_awake = new Voice_Cmd($config_parms{viavoice_awake_phrase}, $config_parms{viavoice_awake_response}, 0, 'mh_activate');
  10. $v_viavoice_asleep = new Voice_Cmd($config_parms{viavoice_asleep_phrase}, $config_parms{viavoice_asleep_response});
  11. $v_viavoice_off = new Voice_Cmd($config_parms{viavoice_off_phrase}, 'you want the microphone off', 1);
  12. # Monitor the Tk button
  13. my ($tk_vr_mode, $tk_vr_mode_prev);
  14. $tk_vr_mode = $tk_vr_mode_prev = $Save{vr_mode} if $Reload;
  15. &tk_radiobutton('VR Mode', \$tk_vr_mode, ['awake', 'asleep', 'off'], ['Awake', 'Asleep', 'Off']);
  16. #print "db $vr_mode_prev\n";
  17. if ($tk_vr_mode_prev ne $tk_vr_mode) {
  18. $tk_vr_mode_prev = $tk_vr_mode;
  19. if ($tk_vr_mode eq 'awake') {
  20. set $v_viavoice_awake 1;
  21. }
  22. elsif ($tk_vr_mode eq 'asleep') {
  23. set $v_viavoice_asleep 1;
  24. }
  25. else {
  26. set $v_viavoice_off 1;
  27. }
  28. }
  29. # Set mode on startup and reload
  30. if ($Reload) {
  31. if ($Save{vr_mode} eq 'awake') {
  32. set $v_viavoice_awake 1;
  33. }
  34. elsif ($Save{vr_mode} eq 'asleep') {
  35. set $v_viavoice_asleep 1;
  36. }
  37. elsif ($Save{vr_mode} eq 'off') {
  38. set $v_viavoice_off 1;
  39. }
  40. print_log "Viavoice set to $Save{vr_mode}";
  41. }
  42. # This is the code that flips between voice modes
  43. $viavoice_awake_timer = new Timer;
  44. if (said $v_viavoice_awake) {
  45. if ($Save{vr_mode} eq 'awake' and !$Reload) {
  46. speak "I am already awake";
  47. }
  48. else {
  49. print_log "VR mode set to awake";
  50. &Voice_Cmd::disablevocab('mh_activate');
  51. &Voice_Cmd::enablevocab('mh');
  52. &Voice_Cmd::disablevocab('mh_words');
  53. &Voice_Cmd::mic('on');
  54. $Save{vr_mode} = 'awake';
  55. set $viavoice_awake_timer $config_parms{viavoice_awake_time} if $config_parms{viavoice_awake_time};
  56. }
  57. $Save{vr_mode} = 'awake';
  58. $tk_vr_mode = $tk_vr_mode_prev = $Save{vr_mode};
  59. }
  60. if (said $v_viavoice_asleep) {
  61. print_log "VR mode set to asleep";
  62. &Voice_Cmd::disablevocab('mh');
  63. &Voice_Cmd::enablevocab('mh_activate');
  64. &Voice_Cmd::disablevocab('mh_words');
  65. &Voice_Cmd::mic('on');
  66. $Save{vr_mode} = 'asleep';
  67. $tk_vr_mode = $tk_vr_mode_prev = $Save{vr_mode};
  68. }
  69. if (said $v_viavoice_off) {
  70. print_log "VR mode set to off";
  71. &Voice_Cmd::mic('off');
  72. $Save{vr_mode} = 'off';
  73. $tk_vr_mode = $tk_vr_mode_prev = $Save{vr_mode};
  74. }
  75. # Reset the timer so we stay in awake mode if VR is active
  76. if ($Save{vr_mode} eq 'awake' and &Voice_Cmd::said_this_pass and $config_parms{viavoice_awake_time}) {
  77. set $viavoice_awake_timer $config_parms{viavoice_awake_time};
  78. }
  79. # Go to asleep mode if no command have ben heard recently
  80. if (expired $viavoice_awake_timer and $Save{vr_mode} eq 'awake') {
  81. print_log "viavoice active mode timed out";
  82. set $v_viavoice_asleep 1;
  83. speak $config_parms{viavoice_timeout_response};
  84. }
  85. # Create a command search menu with all the Voice_Cmd words
  86. # noloop=start
  87. my $voice_word_list = join(',', &Voice_Cmd::word_list) if $config_parms{voice_cmd} eq 'viavoice';
  88. $voice_word_list = 'no words listed' unless $voice_word_list;
  89. $v_command_search = new Voice_Cmd('find a command', 'what words?');
  90. $v_command_words = new Voice_Cmd("[$voice_word_list,do it]", '', 0, 'mh_words');
  91. set_icon $v_command_words 'none';
  92. # noloop=stop
  93. #$v_viavoice_alphabet = new Voice_Cmd('[a,b,done]', '', 0, 'mh_spell');
  94. #$v_viavoice_alphabet = new Voice_Cmd('[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,u,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9,done]', '', 0, 'mh_spell');
  95. my $viavoice_cmd;
  96. if (said $v_command_search) {
  97. print_log "VR mode set to spell it mode";
  98. &Voice_Cmd::disablevocab('mh');
  99. &Voice_Cmd::enablevocab('mh_words');
  100. undef $viavoice_cmd;
  101. $Save{vr_mode} = 'list';
  102. }
  103. if ($state = said $v_command_words) {
  104. if ($state eq 'do it') {
  105. my @list = &list_voice_cmds_match($viavoice_cmd);
  106. my $count = @list;
  107. speak "Found $count matching commands for $viavoice_cmd";
  108. my ($text, $i);
  109. if ($count < 4) {
  110. for (@list) {
  111. $i++;
  112. $text .= "$i, $_. ";
  113. }
  114. }
  115. speak $text;
  116. display join("\n - ", "$count matching commands for $viavoice_cmd", @list);
  117. &Voice_Cmd::disablevocab('mh_words');
  118. &Voice_Cmd::enablevocab('mh');
  119. $Save{vr_mode} = 'awake';
  120. }
  121. else {
  122. speak "heard $state";
  123. $viavoice_cmd .= ' ' . $state;
  124. }
  125. }