2009-10-04 8 views
1

La commande ci-dessous pour Windows Speech Recognition force le moteur de reconnaissance vocale à utiliser du texte littéral ("" toutes les soixante-seize personnes ont payé cinq dollars ") au lieu de la valeur par défaut. personnes ont payé 5" $)Besoin d'aide avec le script de reconnaissance vocale Windows pour composer une chaîne

Je suis en train d'adapter cette commande pour supprimer les espaces entre les mots afin que je puisse programmer en utilisant la parole en disant des choses comme:.

"Security Manager" 
-> "Security Manager" 
"Compound That" 
-> "SecurityManager" 

La façon dont je pense que cela pourrait fonctionner est en utilisant une regex pour supprimer les espaces entre le texte sélectionné.Ainsi, dans le code suivant:

<command priority="5"> 
    <listenFor>literal that</listenFor> 
    <emulateRecognition>select that</emulateRecognition> 
    <sendKeys>{250 WAIT}{{CTRL}}c{250 WAIT}</sendKeys> 
     <!-- Works by first inserting the word " literal " before each word 
      example "all 76 people paid $5" 
      is emulated as "literal all literal 76 literal people literal paid literal $5" 
      which produces the result "all seventy six people paid five dollars" 

      EmulateRecognition can fail if the text contains improper formatting or nonsense words 
      (which can easily happen if only part of a word in the document is included in the text selection). 
      When the failure can be handled by "On Error Resume Next", such as EmulateRecognition("literal s") 
      or EmulateRecognition("multiple spaces"), we restore the original text and show feedback message. 
      Unfortunately, some failures, such as EmulateRecognition("nonsens"), cause macros to immediately 
      halt. This is why "replace that with " is used. Either it succeeds, or it fails non-destructively 
      (before any text is deleted). Unfortunately, this can be confusing for the user because the macro 
      can fail without doing anything visible to the user (no changes to the text, and no SetTextFeedback.) 
     --> 
    <script language="VBScript"> 
     <![CDATA[ 
     that = Application.clipboardData.GetData("text") 
     Set regEx = New RegExp 
     regEx.Pattern = "[^\s\w,;:]" 
     If regEx.Test(that) Then 
     Application.SetTextFeedback("Try again without any punctuation selected") 
     Else 
     regEx.Pattern = "(\s) *(\S)" 
     regEx.Global = True 
     that = regEx.Replace(" " & that, "$1literal $2") 
     On Error Resume Next 
     Application.EmulateRecognition("replace that with" & that) 
     If 0 <> Err.Number Then 
      Application.SetTextFeedback("Try again with only the digits selected") 
     End If 
     End If 
    ]]> 
    </script> 
    </command> 

au lieu d'écrire ceci:

 regEx.Pattern = "(\s) *(\S)" 
     regEx.Global = True 
     that = regEx.Replace(" " & that, "$1literal $2") 

Je pense qu'il faudrait utiliser un autre modèle regex qui extrait les espaces entre les mots et repousse les mots ensemble dans la nouvelle sortie.

Je ne sais pas comment faire cela. Apprécierait si quelqu'un a une suggestion.

+0

Je crains que vous ayez plus de chance avec cette question sur Stackoverflow, mais pas de soucis, il sera probablement transféré bientôt –

Répondre

1

Étant donné que vous utilisez déjà la commande 'literal', vous pouvez également utiliser la commande 'nospace' pour supprimer les espaces entre les mots. Voir le examples sur mon blog.

Questions connexes