<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rob's Rhapsody : Speech Recognition</title><link>http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx</link><description>Tags: Speech Recognition</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Microsoft Exchange 2010 Buzz -- Speech is 1 of 5 key features, according to Mary-Jo Foley from ZDNet</title><link>http://blogs.msdn.com/robch/archive/2009/08/14/microsoft-exchange-2010-buzz-speech-is-1-of-5-key-features-according-to-mary-jo-foley-from-zdnet.aspx</link><pubDate>Fri, 14 Aug 2009 17:01:05 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9870047</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/9870047.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9870047</wfw:commentRss><description>&lt;p&gt;Mary-Jo Foley posted an article on her blog on ZDNet yesterday talking about how the RTM buzz for Microsoft Exchange 2010 is growing louder. It's an interesting &lt;a href="http://blogs.zdnet.com/microsoft/?p=3727"&gt;read&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;The Speech team has been busy at work supporting the Exchange team for quite a while, with a new feature for Exchange that allows users to see a text preview of voice mails that arrive in their inbox. &lt;/p&gt;  &lt;p&gt;I've been using it personally for almost 2 years, in one form or another. I recently set my own Exchange server up, and redirected my wife's cell phone voice mails to it too. She now never listens to her voice mails directly. This is a milestone for me, because this is one of the best examples of my work life impacting my personal life, and vice versa. She does give me constructive advice on how to make the system better ... :-)&lt;/p&gt;  &lt;p&gt;In most reviews I've read on Exchange 2010 since the public announcement earlier this year, text preview of voice mails is very often listed in the short list of key new features. That's true in Mary-Jo's article also. Here's what she says about Exchange 2010:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The Exchange 2010 release includes new, integrated e-mail archive functionality; the ability to see text previews of voice mail; a new &amp;#8220;Conversation View&amp;#8221; feature; customizable call-routing menus; and a &amp;#8220;MailTips&amp;#8221; feature designed to help stamp out e-mail &amp;#8220;faux pas.&amp;#8221;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Let us know, once you're using Exchange 2010, how you like the voice mail text preview feature. We like hearing from our customers directly. Both what you &lt;a href="mailto:listen@microsoft?subject=I like Voice Mail Text Preview in Exchange 2010"&gt;like&lt;/a&gt;, and what you &lt;a href="mailto:listen@microsoft?subject=Voice Mail Text Preview in Exchange 2010 suggestions"&gt;don't like&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9870047" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Features/default.aspx">Features</category><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Controlling your PC via PowerShell and Speech Recognition?</title><link>http://blogs.msdn.com/robch/archive/2009/06/28/controlling-your-pc-via-powershell-and-speech-recognition.aspx</link><pubDate>Mon, 29 Jun 2009 02:52:41 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9807820</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/9807820.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9807820</wfw:commentRss><description>&lt;p&gt;I just read a pretty cool post by Joel 'Jaykul' Bennett from HuddledMasses.org where he shows his readers how to use a PowerShell script he wrote to invoke other PowerShell scripts using Speech Recognition. Great idea, Joel. I like it!&lt;/p&gt;  &lt;p&gt;Check it out &lt;a href="http://huddledmasses.org/control-your-pc-with-your-voice-and-powershell/"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9807820" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Customer+Feedback/default.aspx">Customer Feedback</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Microsoft sponsors the 2009-2010 AVIOS Speech Application Programming Contest</title><link>http://blogs.msdn.com/robch/archive/2009/05/11/microsoft-sponsors-the-2009-2010-avios-speech-application-programming-contest.aspx</link><pubDate>Mon, 11 May 2009 17:52:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9603074</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9603074.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9603074</wfw:commentRss><description>&lt;p&gt;One of the cooler parts of my jobs is interacting with customers and partners. One such opportunity I have is being on the board of AVIOS, The Applied Voice Input and Output Society. As a member of AVIOS, I've also been involved behind the scenes in the annual Speech Programming Competition. &lt;/p&gt;  &lt;p&gt;This year Microsoft is back on the scene as a sponsor, as we have been for the 2 years before. I just &lt;a href="http://blogs.msdn.com/speech/archive/2009/05/11/microsoft-sponsors-the-2009-2010-avios-speech-application-programming-contest.aspx"&gt;posted&lt;/a&gt; over on the speech team blog about the contest. You should check it out. &lt;/p&gt;  &lt;p&gt;Do you have what it takes to win a free XBOX360, Visual Studio Professional, or a fancy new Zune?&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9603074" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Tellme/default.aspx">Tellme</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Synthesis/default.aspx">Speech Synthesis</category></item><item><title>TellMe Rolls Out Better Speech Recognition And An Almost-Sexy New Voice Called Zira</title><link>http://blogs.msdn.com/robch/archive/2009/04/29/tellme-rolls-out-better-speech-recognition-and-an-almost-sexy-new-voice-called-zira.aspx</link><pubDate>Wed, 29 Apr 2009 22:19:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9576323</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9576323.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9576323</wfw:commentRss><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;Last night, as 12:01am, Tellme announced their Spring 09 upgrades to their underlying speech platform. You can read all about it &lt;a href="http://www.tellme.com/spring09/customerexperience.php"&gt;here&lt;/a&gt; on &lt;a href="http://www.Tellme.com"&gt;Tellme.com&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;There have been a ton of news articles about it since the announcement, but I liked what &lt;a href="http://www.techcrunch.com/2009/04/28/tellme-rolls-out-better-speech-recognition-and-its-own-voip-network/"&gt;Tech Crunch said&lt;/a&gt; about the new Zira voice. They said it’s “almost sexy”. I never really thought about TTS voices sounding sexy, but … It made for a good article title anyway. :-)&lt;/p&gt;  &lt;p&gt;And … BTW … My team here at Microsoft is really excited about this announcement, too, because our underlying speech technology is powering the new “better speech recognition” and the “almost-sexy new voice called Zira”. &lt;/p&gt;  &lt;p&gt;It’s been a real pleasure working with Tellme since the &lt;a href="http://blogs.msdn.com/robch/archive/2007/03/16/getting-to-know-tellme.aspx"&gt;acquisition&lt;/a&gt;. I’ve had the good fortune of going down to the Tellme offices in Mountain View regularly working with them on a variety of projects for a while now, and I’m super impressed with all the people I’ve interacted with. &lt;/p&gt;  &lt;p&gt;In fact, I’m sitting inside Tellme’s main building typing this right now wondering where I’ll go eat lunch on Castro Street in Mountain View. Will it be Amici’s pizza, or someplace else today?&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9576323" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Tellme/default.aspx">Tellme</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Synthesis/default.aspx">Speech Synthesis</category></item><item><title>Using Windows Speech Recognition to blog?</title><link>http://blogs.msdn.com/robch/archive/2009/01/05/using-windows-speech-recognition-to-blog.aspx</link><pubDate>Mon, 05 Jan 2009 18:22:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9281290</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9281290.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9281290</wfw:commentRss><description>&lt;p&gt;I've been reading a lot of blog posts lately about bloggers using Speech Recognition technology themselves to write their blog articles. Because some bloggers get paid per post that they create, and some others even get paid per character that they write, Speech Recognition is an obvious choice since it can allow users to &amp;quot;type&amp;quot; up to 160 WPM (words per minute). &lt;/p&gt;  &lt;p&gt;Weeding thru my inbox and RSS feeds this morning (there's a lot to read thru since I've been on vacation for a couple weeks) I found this &lt;a href="http://www.practicalecommerce.com/articles/911-Voice-Recognition-Software-Just-Talk-It-Out-"&gt;article&lt;/a&gt; where Jeff Meundel says on &lt;a href="http://www.practicalecommerce.com/"&gt;PracticalCommerce.com&lt;/a&gt; that Windows Speech Recognition is &amp;quot;perhaps the best and coolest part of [...] Vista.&amp;quot; &lt;/p&gt;  &lt;p&gt;Thanks Jeff. We like it too. :-)&lt;/p&gt;  &lt;p&gt;Are you using Windows Speech Recognition to write blog posts?&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9281290" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Cannon camera + EOS Utility + ShutterVoice = Hands-free photography?</title><link>http://blogs.msdn.com/robch/archive/2008/11/26/cannon-camera-eos-utility-shuttervoice-hands-free-photography.aspx</link><pubDate>Wed, 26 Nov 2008 19:50:16 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9144903</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/9144903.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9144903</wfw:commentRss><description>&lt;p&gt;This morning I read a &lt;a href="http://blog.wired.com/gadgets/2008/11/shuttervoice-le.html"&gt;blog entry on Wired&lt;/a&gt; about a new application coming out from a guy named Scott Forman called &lt;a href="http://www.shuttervoice.com/"&gt;ShutterVoice&lt;/a&gt;. It sounds pretty cool! Basically, ShutterVoice promises to bring hands-free photography to photographers that are using Cannon DLSRs along with a utility from Cannon called the EOS Utility. &lt;/p&gt;  &lt;p&gt;If you have all three, you can do wireless hands-free photography. &lt;/p&gt;  &lt;p&gt;Check out the video &lt;a href="http://www.robgalbraith.com/bins/content_page.asp?cid=7-9318-9769"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9144903" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Synthesis/default.aspx">Speech Synthesis</category></item><item><title>Macro of the Day: Disable Cap [textInDocument]</title><link>http://blogs.msdn.com/robch/archive/2008/11/19/macro-of-the-day-disable-cap-textindocument.aspx</link><pubDate>Thu, 20 Nov 2008 08:20:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9127446</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9127446.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9127446</wfw:commentRss><description>&lt;p&gt;A reader recently &lt;a href="mailto:listen@microsoft.com"&gt;wrote to us&lt;/a&gt; here at Microsoft, and asked us if there was a way to disable the built in command for &amp;quot;Cap [textInDocument]&amp;quot;. &lt;/p&gt;  &lt;p&gt;Sometimes, for some people, this command can be recognized a little too easily if you're actually trying to insert text that already exists in the document. So ... I thought ... Time for another Macro of the Day!&lt;/p&gt;  &lt;p&gt;You can disable the built-in command once this macro is in place by saying &amp;quot;Disable Cap [textInDocument]&amp;quot;. You can re-enable it by saying &amp;quot;Enable Cap [textInDocument]&amp;quot;.&lt;/p&gt;  &lt;p&gt;You can download it &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=3852"&gt;here&lt;/a&gt; in our &lt;a href="http://code.msdn.microsoft.com/wsrmacros"&gt;macro code gallery&lt;/a&gt;, or just take a look at it here:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;!-- &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Author:&amp;#160; Rob Chambers [MSFT]     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Contact: listen@microsoft.com &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ================     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; What can I say?      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ================ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Disable Cap textInDocument     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Enable Cap textInDocument &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ================     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; How does it work      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ================&lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For some people, at sometimes, one of the the built-in     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Vista commands (&amp;quot;Cap [textInDocument]&amp;quot;) gets accidentally      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; recognized when it shouldn't. &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; This macro is a work around for that problem. It &amp;quot;hijacks&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; the recognition for &amp;quot;Cap [textInDocument]&amp;quot; (if the command      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; is enabled) and instead just inserts the text in the document. &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; The macro also demonstrates how to have another set of      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; commands that enables and disables a 3rd command...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; --&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;lt;listenFor&amp;gt;Disable cap text in document&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setState name=&amp;quot;disableCapTextInDocument&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;lt;listenFor&amp;gt;Enable cap text in document&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setState name=&amp;quot;disableCapTextInDocument&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;command priority=&amp;quot;100&amp;quot;&amp;gt;     &lt;br /&gt;&amp;lt;stateIsSet name=&amp;quot;disableCapTextInDocument&amp;quot; value=&amp;quot;1&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;lt;listenFor&amp;gt;cap [textInDocument]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;lt;setTextFeedback&amp;gt;Inserting text. Say Enable &amp;quot;Cap [textInDocument]&amp;quot; to re-enable...&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;lt;insertText&amp;gt;{[textInDocument]}&amp;lt;/insertText&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9127446" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Macro of the Day: Microphone Control</title><link>http://blogs.msdn.com/robch/archive/2008/11/07/macro-of-the-day-microphone-control.aspx</link><pubDate>Sat, 08 Nov 2008 00:36:21 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9053108</guid><dc:creator>robch</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/robch/comments/9053108.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9053108</wfw:commentRss><description>&lt;p&gt;I've got two microphones that I use most of the time.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;An Andrea SoundMAX SuperBeam 2 element array-microphone from Andrea Electronics&lt;/li&gt;    &lt;li&gt;An xTag wireless microphone from RevoLabs&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;I really love both of them, and I use them interchangeably throughout the day. &lt;/p&gt;  &lt;p&gt;If I'm doing quick command and control stuff while I'm typing, I prefer to use the Andrea microphone. That way, I can just mash the &amp;lt;ctrl-windows&amp;gt; key, say what I want (like &amp;quot;Insert my public signature&amp;quot;) and wishes come true.&lt;/p&gt;  &lt;p&gt;However, if I'm a more relaxed position, doing dictation, or not sitting near my PC (I have a couch in my office :-)), I'll use my wireless xTag microphone.&lt;/p&gt;  &lt;p&gt;But ... Having two different microphones causes me a bit of a problem sometimes. I have to actually switch back and forth between the two microphones. That's certainly possible in Vista with Windows Speech Recognition, but it's not as easy as I wanted it to be. &lt;/p&gt;  &lt;p&gt;Thus ... A new &amp;quot;Macro of the day!&amp;quot; was born.&lt;/p&gt;  &lt;p&gt;Today's macro allows you to say one of the following things:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Microphone     &lt;br /&gt;Switch microphone &lt;/p&gt;    &lt;p&gt;[microphone] microphone     &lt;br /&gt;Switch to [microphone]      &lt;br /&gt;Switch to [microphone] microphone &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first two commands will simply bring up a dialog and let you pick which microphone you want to use. The 2nd group of commands will automatically switch to the microphone you want by simply by saying &amp;quot;Andrea microphone&amp;quot;, or &amp;quot;xTag microphone&amp;quot;. &lt;/p&gt;  &lt;p&gt;Now... I till have to use one of the microphones to switch to the other one, but now it's a seamless transfer. &lt;/p&gt;  &lt;p&gt;Here's the macro both in copy/paste form, as well as a direct link to my macro library on MSDN &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=3711"&gt;here&lt;/a&gt;:&lt;/p&gt;  &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;#160; &amp;lt;!-- &lt;/p&gt;  &lt;p&gt;&amp;#160; Author:&amp;#160; Rob Chambers [MSFT]   &lt;br /&gt;&amp;#160; Contact: listen@microsoft.com &lt;/p&gt;  &lt;p&gt;&amp;#160; ================   &lt;br /&gt;&amp;#160; What can I say?    &lt;br /&gt;&amp;#160; ================ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Microphone   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch microphone &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [microphone] microphone   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch to [microphone]    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Switch to [microphone] microphone &lt;/p&gt;  &lt;p&gt;&amp;#160; ================   &lt;br /&gt;&amp;#160; How does it work    &lt;br /&gt;&amp;#160; ================    &lt;br /&gt;&amp;#160; This macro demonstrates how to build a dynamic rule based on    &lt;br /&gt;&amp;#160; the audio inputs that the Speech API (SAPI) knows to exist    &lt;br /&gt;&amp;#160; on the PC. &lt;/p&gt;  &lt;p&gt;&amp;#160; Upon recognition, it will disambiguate the microphone name   &lt;br /&gt;&amp;#160; if it's ambiguous (or not included in the phrase), and then    &lt;br /&gt;&amp;#160; ultimately set the current microphone to use. &lt;/p&gt;  &lt;p&gt;&amp;#160; --&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;command priority=&amp;quot;100&amp;quot;&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;*+ microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[microphone] microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch to *+ microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Switch to [microphone] ?microphone&amp;lt;/listenFor&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;disambiguate title=&amp;quot;Which microphone do you want to use?&amp;quot; prompt=&amp;quot;Choose a Microphone&amp;quot; timeout=&amp;quot;15&amp;quot; propname=&amp;quot;TokenId&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the token id that was stored as a semantic property in the populated by script below,   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' as well as the text that was spoken in this utterance that generated the token id semantic property    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneTokenId = &amp;quot;{[TokenId]}&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneName = &amp;quot;{[*TokenId]}&amp;quot; &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If there was no matching microphone spoken (e.g. if the user just said, &amp;quot;Microphone&amp;quot;)&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (strMicrophoneTokenId = &amp;quot;&amp;quot;) Then &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the rule generator script below, and tell it to update the list of microhpones on teh system   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set audioInputs = CommandSet.RuleGenerators(&amp;quot;microphone&amp;quot;).Script.UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Loop thru each of those inputs, and prepare to ask the user which to use with a ChooseForList object   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 0 to audioInputs.Count - 1    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call ChooseFromList.Items.AddItem(audioInputs(i).Phrase, audioInputs(i).Property)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Go ahead and ask the user which microhpone to use    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; audioInputIndex = ChooseFromList.Choose(&amp;quot;Change the default audio input from &amp;quot; + Result.RecoContext.Recognizer.AudioInput.GetDescription() + &amp;quot; to:&amp;quot;, &amp;quot;Change audio input&amp;quot;) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If the user made a selection, update the token id and what the text for that token is   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (audioInputIndex &amp;gt;= 0) Then    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneName = audioInputs(audioInputIndex).Phrase    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; strMicrophoneTokenId = audioInputs(audioInputIndex).Property    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we know what microhone to switch to now...    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (strMicrophoneTokenId &amp;lt;&amp;gt; &amp;quot;&amp;quot;) Then &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the speech ux to go to off mode (273 is WM_COMMAND, and 102 is &amp;quot;Off&amp;quot; for the speech ux in Vista)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Application.SendMessage(&amp;quot;MS:SpeechTopLevel&amp;quot;, &amp;quot;&amp;quot;, 273, 102, 0) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Update the default for the input category to the new microphone token id   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Result.RecoContext.Recognizer.GetAudioInputs()(0).Category.Default = strMicrophoneTokenId    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Let the user know what we did, but automatically time out after 1 second    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Application.Alert(&amp;quot;Switched to &amp;quot; &amp;amp; strMicrophoneName , &amp;quot;Microphone&amp;quot;, 1) &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;   &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;    &lt;br /&gt;&amp;lt;/command&amp;gt;    &lt;br /&gt;&amp;lt;ruleScript name=&amp;quot;microphone&amp;quot; propname=&amp;quot;TokenId&amp;quot; language=&amp;quot;VBScript&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ' Update the list of Microphones right now   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; Call UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Function UpdateMicrophones() &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Clear all the items in case we're updating the list   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Items.RemoveAll &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Create a shared recognizer, get the audio inputs that recognizer can use   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' and add each of the inputs as a phrase to the rule (using the token id as the property)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set audioInputs = recognizer.GetAudioInputs()    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 0 to audioInputs.Count - 1    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Items.AddItem(audioInputs(i).GetDescription(), audioInputs.Item(i).Id, True)    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Commit the changes to the rule now, and return the items to the caller. This enables   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' us the command's script to use this function to update the list and return the list    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' in a single call/function.    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Call Rule.Commit    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set UpdateMicrophones = Rule.Items    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; End Function &lt;/p&gt;  &lt;p&gt;&amp;#160; ]]&amp;gt;   &lt;br /&gt;&amp;lt;/ruleScript&amp;gt; &lt;/p&gt;  &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9053108" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>A user authored guide to macros: WSRMacros: The User Guide</title><link>http://blogs.msdn.com/robch/archive/2008/10/23/a-user-authored-guide-to-macros-wsrmacros-the-user-guide.aspx</link><pubDate>Thu, 23 Oct 2008 17:23:39 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:9013058</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/9013058.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=9013058</wfw:commentRss><description>&lt;p&gt;Many of you know that we've been working on our &lt;a href="http://download.speechmacros.com"&gt;Windows Speech Recognition Macros&lt;/a&gt; utility for a while now. &lt;/p&gt;  &lt;p&gt;We released the first technical preview in April, a refresh in August/September, and we're continuing to refine the technology that will ultimately lead to a full release sometime soon.&lt;/p&gt;  &lt;p&gt;One of the difficulties users have faced is good documentation for WSR Macros. We're working on completing our documentation and will include it with the product in the future, but we're not quite done yet.&lt;/p&gt;  &lt;p&gt;But ... A macro enthusiast in the community has come to rescue for WSR Macros users. &lt;/p&gt;  &lt;p&gt;Enter Brad Trott (from Marty Markoe's &lt;a href="http://www.msspeech-forum.com/default.asp?C=1"&gt;mymsspeech.com&lt;/a&gt; web site) and his latest efforts: &lt;em&gt;WSRMacros: The User Guide.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;WSRMacros: The User Guide &lt;/em&gt;is a 70 page electronic book chock full of insightful thoughts and ideas on how to use Windows Speech Recognition Macros.&lt;/p&gt;  &lt;p&gt;If you're curious how to build powerful macros, and you have $9.95 to spare, it's likely well worth it to purchase your very own copy &lt;a href="http://www.mymsspeech.com/microphones/prod_details.asp?prodID=231&amp;amp;name=WSRMacrosGuide"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;You can also see other products mymsspeech.com offers for Windows Speech Recognition (including instructional videos, toolkits, voice recorders, and some of the best microphones you can find on the web) &lt;a href="http://www.mymsspeech.com/microphones/product_detail.asp?subcatID=73"&gt;here&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=9013058" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Applications+that+use+Microsoft+Speech+technology/default.aspx">Applications that use Microsoft Speech technology</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Google Chrome doesn't support Speech Recognition in Vista? IE and Firefox do... Hmmm...</title><link>http://blogs.msdn.com/robch/archive/2008/09/16/google-chrome-doesn-t-support-speech-recognition-in-vista-ie-and-firefox-do-hmmm.aspx</link><pubDate>Tue, 16 Sep 2008 21:56:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8954253</guid><dc:creator>robch</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/robch/comments/8954253.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8954253</wfw:commentRss><description>&lt;P&gt;I haven't tried it out personally, but over on the &lt;A href="http://blog.gadodia.net/" mce_href="http://blog.gadodia.net/"&gt;Habitually Good&lt;/A&gt; blog, Vaibhav says that Google's new Chrome browser &lt;A href="http://blog.gadodia.net/google-chrome-pros-and-cons/" mce_href="http://blog.gadodia.net/google-chrome-pros-and-cons/"&gt;doesn't work with Windows Speech Recognition&lt;/A&gt; in Windows Vista. That's too bad... Both IE7, IE8 Beta 2, and Firefox work great with it.&lt;/P&gt;
&lt;P&gt;Hey Google: What's up? If any Google Devs want to learn more about how to add support for SR, &lt;A class="" href="mailto:listen@microsoft.com?subject=Chrome%20doesn't%20support%20Speech%20Recognition" mce_href="mailto:listen@microsoft.com?subject=Chrome%20doesn't%20support%20Speech%20Recognition"&gt;let me know&lt;/A&gt;. I'll point you to the &lt;EM&gt;documented&lt;/EM&gt; &lt;A class="" href="http://msdn.microsoft.com/en-us/library/ms697240(VS.85).aspx" mce_href="http://msdn.microsoft.com/en-us/library/ms697240(VS.85).aspx"&gt;interfaces&lt;/A&gt; for doing that. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8954253" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Applications/default.aspx">Speech Applications</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Macro of the Day: Math Test!</title><link>http://blogs.msdn.com/robch/archive/2008/09/11/macro-of-the-day-math-test.aspx</link><pubDate>Thu, 11 Sep 2008 17:33:26 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8944690</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8944690.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8944690</wfw:commentRss><description>&lt;p&gt;One of the joys of being a parent is helping them learn. I'm very lucky, in that regard, because my kids love learning. In fact, my son Zac really loves Math. He gets that from both his Mom and his Dad. &lt;/p&gt;  &lt;p&gt;So, when he was a little guy, I made a Word Macro to make math work sheets. At first this was just for Addition. I'd load Word up, tell the macro that I wanted the work sheet to be for +1, it'd create 50 random +1 math problems, I'd print it out, give it to Zac, and he'd do it. We'd do that over and over until he was really good at +1. Then, we'd move on to +2. Etc. Etc. Once he'd mastered addition, I changed the math test to do a +1 through +9 review work sheets. He'd do that until he was really good at it. This progressed thru subtraction, then multiplication, and then division. Around the summer between 2nd and 3rd grade, he had all his math facts squarely mastered. &lt;/p&gt;  &lt;p&gt;All along, one of the challenges for him was actually writing the answers down on paper. It was certainly important that he get better at his dexterity, but it also skewed how well he knew the math facts. &lt;/p&gt;  &lt;p&gt;So ... Being the speech guy that I am, I always thought, &amp;quot;Hmm... Wouldn't it be cool if I wrote a Math Test program for him?&amp;quot; Then, a few years ago when we started developing the Windows Speech Recognition Macro system, I always had in the back of my mind, &amp;quot;Yeah... I should make a Math Test macro someday.&amp;quot;&lt;/p&gt;  &lt;p&gt;Last weekend, I finally decided to give that a go. About an hour later I had the basic macro done. You can download it &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=2954"&gt;here&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;It's self documenting, but if you're a bit skeptic about reading XML, here's the gist of what you can say to start the math test (the rest of the math test should be self-explanatory):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Math Test &lt;/p&gt;    &lt;p&gt;Math Test [Plus/Minus/Times/Divided by] [0to9]     &lt;br /&gt;Math Test [Plus/Minus/Times/Divided by] [0to9] to [0to9] &lt;/p&gt;    &lt;p&gt;[0to99] problem [Addition/Subtraction/Multiplication/Division] Math Test      &lt;br /&gt;[0to99] problem [Addition/Subtraction/Multiplication/Division] Math Test [0to9] to [0to9] &lt;/p&gt;    &lt;p&gt;[0to99] problem Math Test [Plus/Minus/Times/Divided by] [0to9]     &lt;br /&gt;[0to99] problem Math Test [Plus/Minus/Times/Divided by] [0to9] to [0to9] &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;a href="mailto:listen@microsoft.com?subject=Math%20Test%20Macro%20of%20the%20Day"&gt;Let me know&lt;/a&gt; what you think!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8944690" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>JetBlue chooses Microsoft speech recognition technology over Nuance</title><link>http://blogs.msdn.com/robch/archive/2008/09/02/jetblue-chooses-microsoft-speech-recognition-technology-over-nuance.aspx</link><pubDate>Tue, 02 Sep 2008 17:30:54 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8920066</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8920066.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8920066</wfw:commentRss><description>&lt;p&gt;Here's an interesting &lt;a href="http://weblog.infoworld.com/enterprisewindows/archives/2008/08/speech_recognit.html"&gt;article&lt;/a&gt; on JetBlue's choice of using Microsoft's speech technology over that of Nuance. I especially like this tag line:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Redmond shakes up the voice-recognition space by offering more reliable software for less&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The author of the article also has the following to say about Windows Speech Recognition that's baked into every copy of Windows Vista:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Personally, I've worked with the new speech-recognition tools and I thought they were amazing. Easy to use and, best of all, it understood my New York accent without a problem.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Thanks, Mr. Bruzzese. Glad you like it.&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8920066" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/In+the+News/default.aspx">In the News</category><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category></item><item><title>Macro of the Day: Search Tivo for That!</title><link>http://blogs.msdn.com/robch/archive/2008/09/01/macro-of-the-day-search-tivo-for-that.aspx</link><pubDate>Tue, 02 Sep 2008 07:35:14 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8918840</guid><dc:creator>robch</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/robch/comments/8918840.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8918840</wfw:commentRss><description>&lt;p&gt;Every year in the Fall it's time for me to check out &lt;a href="http://www.tvpicks.net/"&gt;what's new on TV&lt;/a&gt;, and decide what, if anything, I'm going to start watching. This year's no different... &lt;/p&gt;  &lt;p&gt;Ah... Well ... It was actually different. This year, just a couple weeks ago, my Tivo completely died. I'd only had it for about 7 months, but it died. Oh well. It was under warranty. &lt;/p&gt;  &lt;p&gt;After a couple back-and-forths with &lt;a href="http://www.tivo.com"&gt;Tivo&lt;/a&gt; customer service, I was the proud owner of a brand new Tivo HD. But ... It didn't have any of my old recorded shows on it, nor did it have any of my programming on it. Sigh. &lt;/p&gt;  &lt;p&gt;If you've ever tried to setup a Tivo with your full schedule of what you watch, you'll probably already know, it's a lot of work to set it up. Especially from the remote control. But ... Tivo does have that fancy &lt;a href="http://www3.tivo.com/tivo-tco/index.do"&gt;Tivo Central Online&lt;/a&gt;, that allows you to use your web browser to find shows, and schedule them for recording.&lt;/p&gt;  &lt;p&gt;Cool! But ... that's still a lot of typing and going back and forth with my web browser. &lt;/p&gt;  &lt;p&gt;Or ... Is it? &lt;/p&gt;  &lt;p&gt;Nope! Not if you're using &lt;a href="http://download.speechmacros.com/"&gt;Windows Speech Recognition Macros&lt;/a&gt;! &lt;/p&gt;  &lt;p&gt;I just whipped up a quick macro that let's me say:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&amp;quot;Search Tivo for that&amp;quot;, or&lt;/li&gt;    &lt;li&gt;&amp;quot;Search Tivo for [...]&amp;quot;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I can say anything I want for the [...] part, too. &lt;/p&gt;  &lt;p&gt;Yeah!!! Now, I can set up my Tivo as easily as saying &amp;quot;Search Tivo for House&amp;quot;, or &amp;quot;Search Tivo for Prison Break&amp;quot;. Neat, eh?&lt;/p&gt;  &lt;p&gt;You too can set up your Tivo this fall, just as easily, by downloading today's Macro of the Day: &lt;a href="http://code.msdn.microsoft.com/Project/Download/FileDownload.aspx?ProjectName=wsrmacros&amp;amp;DownloadId=2952"&gt;Search Tivo for That&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8918840" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>WSRMacros - A new MSDN Code Gallery for Speech Macros</title><link>http://blogs.msdn.com/robch/archive/2008/08/24/wsrmacros-a-new-msdn-code-gallery-for-speech-macros.aspx</link><pubDate>Mon, 25 Aug 2008 09:07:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8893372</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8893372.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8893372</wfw:commentRss><description>&lt;p&gt;I've always wanted a good place to upload all my speech macros that I talk about on my Macro of the Day posts. And now ... Finally. I have a home for them.&lt;/p&gt;  &lt;p&gt;Check it out &lt;a href="http://code.msdn.microsoft.com/wsrmacros"&gt;here&lt;/a&gt;. Neat... &lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8893372" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item><item><title>Speech Macro of the Day: Speech Dictionary</title><link>http://blogs.msdn.com/robch/archive/2008/08/02/speech-macro-of-the-day-speech-dictionary.aspx</link><pubDate>Sun, 03 Aug 2008 01:06:47 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8808773</guid><dc:creator>robch</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/robch/comments/8808773.aspx</comments><wfw:commentRss>http://blogs.msdn.com/robch/commentrss.aspx?PostID=8808773</wfw:commentRss><description>&lt;p&gt;I get feedback from people, from time to time, that they'd like a more efficient way to add items to their speech dictionary. Although, there is a facility in Windows Speech Recognition already to do this, it's one word at a time, and it only allows you to record the pronunciation, not specify it yourself. &lt;/p&gt;  &lt;p&gt;So ... What do I do when I have request like this? I make a new macro of the day. Thus, today's speech macro of the day: Speech Dictionary.wsrMac&lt;/p&gt;  &lt;p&gt;First, if we're going to be messing around with the speech dictionary, it might be nice to see what's already in it... To do that, I made a command where I can say &amp;quot;Export the speech dictionary&amp;quot;, and it'll export all the words/phrases that have been customized into a text file, and then launch that text file for me to take a look at. Here's the command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Export ?the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileName = &amp;quot;dictionary.txt&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set words = lex.GetWords(1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set file = fso.CreateTextFile(fileName, 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each word in words     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (word.LangId = 1033) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set prons = word.Pronunciations     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If prons.Count = 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; vbCrLf&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each pron in prons      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; &amp;quot;/&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron.PartOfSpeech = 61440 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write &amp;quot;BLOCKED&amp;quot; &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write pron.Symbolic &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Close      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Run(fileName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As you can see, it uses a bunch of speech APIs that are already in Vista, that any application can take advantage of. The first 7 lines opens up the speech dictionary (aka User Lexicon), and also opens up a file (dictionary.txt) to stick the words in in a more human readable format. &lt;/p&gt;  &lt;p&gt;Then, for each word that it finds, it checks the language, and if it's 1033 (which means US English), it'll output the word into the file. But to do that, it needs to see how many pronunciations are available for each word. If there are zero, it'll just output the word. If there are more than one, it'll output one line per pronunciation. &lt;/p&gt;  &lt;p&gt;There's also a special case, where if the part of speech is &amp;quot;61440&amp;quot;, it outputs the word &amp;quot;BLOCKED&amp;quot;. &amp;quot;61440&amp;quot; is a special kind of part of speech that the underlying speech platform uses to tell the underlying speech engine, this word should be blocked and not recognized at any time. The &amp;quot;BLOCKED&amp;quot; convention is just one I made up for this macro. &lt;/p&gt;  &lt;p&gt;After looping thru all the words, it'll close the file, and launch the text file that was created. &lt;/p&gt;  &lt;p&gt;Here's a sample of what my speech dictionary looks like when I say &amp;quot;Export the speech dictionary&amp;quot;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Ima/BLOCKED     &lt;br /&gt;im/BLOCKED      &lt;br /&gt;Visual Studio/v ih zh uw l s t uw d iy ow      &lt;br /&gt;antidisestablishmentarianism/ae n t ay d ih s ih s t ae b l ih sh m ax n t eh r iy ax n ih z ax m      &lt;br /&gt;Rob Chambers      &lt;br /&gt;Itamar/ih d ae m aa r      &lt;br /&gt;Itamar/ih t ae m aa r      &lt;br /&gt;Zac Chambers      &lt;br /&gt;Nic Chambers      &lt;br /&gt;Bec Chambers      &lt;br /&gt;Jac Chambers&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The first few I've pasted here are words that the system has learned thru adaptation that I don't actually want it to use. Sometimes when I say &amp;quot;I am a GPM at Microsoft&amp;quot;, it thinks I'm saying Ima or im. Thus... The first time I saw that happen, I selected Ima, and blocked it from my dictionary. More on that in a second...&lt;/p&gt;  &lt;p&gt;Then, you can see for Visual Studio, I've actually got a full pronunciation listed. I probably don't have to, but it's here to show you that you can either have pronunciations listed, or not. Having it added as a single unit, ensures that when I say it, it'll always be cased properly. &lt;/p&gt;  &lt;p&gt;The next word, &amp;quot;antidisestablishmentarianism&amp;quot;, is one of the longest words in the English language, but it's not included in the speech dictionary by default. My son, Zac, loves this word, so of course I have to have it in my speech dictionary. &lt;/p&gt;  &lt;p&gt;Next, you can see my name is listed with no pronunciation. Since both my first and last name are also common words, I've added my name here as a single unit, so when I say &amp;quot;Rob Chambers&amp;quot;, I again get the proper casing. &lt;/p&gt;  &lt;p&gt;Next up, is Itamar, pronounced two different ways. One with a &amp;quot;d&amp;quot; sound and one with a &amp;quot;t&amp;quot; sound. This way, no matter how I end up saying it in a hurry, I can speak Itamar's name properly in email communication with Itamar. BTW ... If you don't know Itamar, you should check out his ms-speech forum on Yahoo! Groups. It's a great place to learn more about Microsoft Speech and speech recognition in general. &lt;/p&gt;  &lt;p&gt;Next up are the names of my kids. I have 4 boys, and they have short forms of more traditional names for their first names, so that their initials actually are the same as their first names. I played a bit too many video games as a kid, and RLC wasn't that cool for initials, compared with other kids in my neighborhood. My kids initials are the same as their names. It throws their teachers for a loop at first, but ... Well ... What can I say... I like it. So do they.&lt;/p&gt;  &lt;p&gt;OK, now that I've described the lines, let's talk about the format of the pronunciations for a minute. These pronunciations are an attempt at human readable form, but using the exact same form as the underlying speech platform. That brings me to the next command, &amp;quot;Show phonemes&amp;quot;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Show phonemes&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;run command=&amp;quot;&lt;a href="http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx"/"&gt;http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx&amp;quot;/&lt;/a&gt;&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Say it, and it'll take you to the page on MSDN that describes what the American English Phoneme Representation is for the Speech API.&lt;/p&gt;  &lt;p&gt;OK, now we're getting to the fun part. Now, let's say you wanted to add a new word. The command I'm about to show you, will let you say &amp;quot;Add that to the speech dictionary&amp;quot;, and it'll copy whatever word is selected in your document (using the Windows clipboard), and add it to the speech dictionary with no specific pronunciation. &lt;/p&gt;  &lt;p&gt;When I originally wrote this set of commands, I had 4 different commands. One for adding words, one for removing words, one for blocking them, and one for unblocking them. I quickly saw that they were all identical, so I made one command that can do any one of those 4 operations. Here's what it looks like with it's helper listenForList:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that ?from ?to the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Speech Dictionary: {[operationPhrase]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the &amp;quot;that&amp;quot; text from the curent application...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if we're adding prons, adding phrases, remove phrases, or blocking phrases     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; operation = &amp;quot;{[operation]}&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we're adding a pron, we'll need to use the recognizer, otherwise we'll just need the lexicon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Keep track of how many words/phrases we added, and loop thru the lines in the &amp;quot;that&amp;quot;...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Do &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the next line break     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineSeperatorPos = InStr(lineStartPos, that, Chr(10))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (lineSeperatorPos = 0) Then lineSeperatorPos = Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the text for that line     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisLine = Mid(that, lineStartPos, lineSeperatorPos - lineStartPos + 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = lineStartPos + Len(thisLine) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Trim off the CR/LF     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(10)) Then thisLine = Left(thisLine, Len(thisLine) - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(13)) Then thisLine = Left(thisLine, Len(thisLine) - 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we have something to operate on     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Len(Trim(thisLine)) &amp;gt; 0) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if there's a pronuncation included     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pronSeperatorPos = InStr(thisLine, &amp;quot;/&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (pronSeperatorPos = 0) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with no pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, thisLine, &amp;quot;AddRemoveWord&amp;quot;, thisLine)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 61440)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the pronuncation and collapse it      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; word = Left(thisLine, pronSeperatorPos - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = Right(thisLine, Len(thisLine) - pronSeperatorPos)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = CollapsePron(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Special case the &amp;quot;BLOCKED&amp;quot; pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron=&amp;quot;BLOCKED&amp;quot; Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 61440      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with the pronuncation (and just continue if there's an error)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, word, &amp;quot;AddRemoveWord&amp;quot;, word)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(word, 1033, 61440, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = cWords + 1 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Loop while lineStartPos &amp;lt; Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the user what we did...     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (cWords = 1) Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciation for &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciations for &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function CollapsePron(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = &amp;quot;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 to Len(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Not insideBrackets) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Mid(pron, i, 1) = &amp;quot;[&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbTrue      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) &amp;lt;&amp;gt; &amp;quot;/&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = ret &amp;amp; Mid(pron, i, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) = &amp;quot;]&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CollapsePron = ret      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Function      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;and:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;listenForList name=&amp;quot;operationPhrase&amp;quot; propname=&amp;quot;operation&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pronunciation&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pron&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;add&amp;quot;&amp;gt;Add&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Remove&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;block&amp;quot;&amp;gt;Block&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Unblock&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;lt;/listenForList&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I'll leave the details on the specifics for an exercise for the readers. As a user of the macro, though, you can now say things like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Add a pronunciation for that from the speech dictionary&amp;quot;,     &lt;br /&gt;&amp;quot;Add that to the speech dictionary&amp;quot;,      &lt;br /&gt;&amp;quot;Remove that from the speech dictionary&amp;quot;,      &lt;br /&gt;&amp;quot;Block that from the speech dictionary&amp;quot;, and      &lt;br /&gt;&amp;quot;Unblock that from the speech dictionary&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Your selection will have to be a single word/phrase, or multiple&amp;#160; words/phrases separated by line breaks. The word/phrases can also have a trailing pronunciation, similar in form to what you see in the output from &amp;quot;Export the speech dictionary&amp;quot;.&lt;/p&gt;  &lt;p&gt;&amp;quot;OK, but how can I generate those pronunciations myself?&amp;quot; Good question!&lt;/p&gt;  &lt;p&gt;Use this command:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;Insert sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like...&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set pc = CreateObject(&amp;quot;SAPI.SpPhoneConverter&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pc.LanguageId = 1033 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;/&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; firstElement = Result.PhraseInfo.Properties.Item(0).FirstElement      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; numberOfElements = Result.PhraseInfo.Properties.Item(0).NumberOfElements &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 To numberOfElements     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set elem = Result.PhraseInfo.Elements.Item(firstElement + i - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = pron &amp;amp; &amp;quot;[&amp;quot; &amp;amp; elem.LexicalForm &amp;amp; &amp;quot;]&amp;quot; &amp;amp; &amp;quot;/&amp;quot; &amp;amp; pc.IdToPhone(elem.Pronunciation) &amp;amp; &amp;quot; &amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Wait(0.25)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like: &amp;quot; &amp;amp; pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.InsertText(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This will use dictation to allow you to say &amp;quot;Sounds like Visual Studio&amp;quot;, and it'll output /[visual]/v ih zh uw l /[studio]/s t uw d iy ow. So, if you have a word that you're trying to add, you can use the built in pronunciations of other words that WSR already knows about, to cut and paste together your own pronunciation. &lt;/p&gt;  &lt;p&gt;Another way to do it would be to select the word of phrase you wanted to build a pronunciation for, and saying &amp;quot;What's that sound like?&amp;quot;, which is the final command we'll put into this macro:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;What's that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;What does that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Go after that&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Insert sounds like &amp;quot; &amp;amp; that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That will copy the selection, move right after it, and then pretend you actually said it. For many words/phrases, this will work even if Windows Speech Recognition doesn't really know how to pronounce the word/phrase, because the system will make it's best guess on how to pronounce it just like it would if you were trying to click on that word on a web page with your voice. &lt;/p&gt;  &lt;p&gt;OK ... Now here's another command that will make your phrases a little shorter if you're actually using the commands inside Notepad.exe with the dictionary.txt file open:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;notepad.exe&amp;quot; windowTitleContains=&amp;quot;dictionary.txt&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;emulateRecognition&amp;gt;{[operationPhrase]} that the speech dictionary&amp;lt;/emulateRecognition&amp;gt;      &lt;br /&gt;&amp;lt;/command&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This basically only works when notepad is in focus, and it's editing dictionary.txt (as it would be when you've just said &amp;quot;Export the speech dictionary&amp;quot;. This will enable you to say simpler commands like:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Add a pronunciation for that&amp;quot;,     &lt;br /&gt;&amp;quot;Add that&amp;quot;,      &lt;br /&gt;&amp;quot;Remove that&amp;quot;,      &lt;br /&gt;&amp;quot;Block that&amp;quot;, and      &lt;br /&gt;&amp;quot;Unblock that&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here's the macro in complete form:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;lt;speechMacros&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;!-- &lt;/p&gt;    &lt;p&gt;NOTE #1: The magic number 1033 represent en-us      &lt;br /&gt;NOTE #2: The magic number 6552 is a special hack to represent the desktop window handle (Validated on XP, and Vista)      &lt;br /&gt;NOTE #3: The magic number 61440 means that this &amp;quot;word/phrase&amp;quot; should be blocked &lt;/p&gt;    &lt;p&gt;--&amp;gt;     &lt;br /&gt;&amp;#160; &amp;lt;command&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that ?from ?to the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;setTextFeedback&amp;gt;Speech Dictionary: {[operationPhrase]}&amp;lt;/setTextFeedback&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Get the &amp;quot;that&amp;quot; text from the curent application...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if we're adding prons, adding phrases, remove phrases, or blocking phrases     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; operation = &amp;quot;{[operation]}&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we're adding a pron, we'll need to use the recognizer, otherwise we'll just need the lexicon&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set recognizer = CreateObject(&amp;quot;SAPI.SpSharedRecognizer&amp;quot;)       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Keep track of how many words/phrases we added, and loop thru the lines in the &amp;quot;that&amp;quot;...      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = 1      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Do &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the next line break     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineSeperatorPos = InStr(lineStartPos, that, Chr(10))      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (lineSeperatorPos = 0) Then lineSeperatorPos = Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the text for that line     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; thisLine = Mid(that, lineStartPos, lineSeperatorPos - lineStartPos + 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lineStartPos = lineStartPos + Len(thisLine) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Trim off the CR/LF     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(10)) Then thisLine = Left(thisLine, Len(thisLine) - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; if (Right(thisLine, 1) = Chr(13)) Then thisLine = Left(thisLine, Len(thisLine) - 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' If we have something to operate on     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Len(Trim(thisLine)) &amp;gt; 0) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Determine if there's a pronuncation included     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pronSeperatorPos = InStr(thisLine, &amp;quot;/&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (pronSeperatorPos = 0) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with no pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, thisLine, &amp;quot;AddRemoveWord&amp;quot;, thisLine)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(thisLine, 1033, 0)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(thisLine, 1033, 61440)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Find the pronuncation and collapse it      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; word = Left(thisLine, pronSeperatorPos - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = Right(thisLine, Len(thisLine) - pronSeperatorPos)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = CollapsePron(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Special case the &amp;quot;BLOCKED&amp;quot; pronuncation      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 0      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron=&amp;quot;BLOCKED&amp;quot; Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; partOfSpeech = 61440      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Perform the operation with the pronuncation (and just continue if there's an error)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Resume Next&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call recognizer.DisplayUI(65552, word, &amp;quot;AddRemoveWord&amp;quot;, word)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call lex.AddPronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call lex.RemovePronunciation(word, 1033, partOfSpeech, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call lex.AddPronunciation(word, 1033, 61440, pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; On Error Goto 0&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; cWords = cWords + 1 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Loop while lineStartPos &amp;lt; Len(that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ' Tell the user what we did...     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (cWords = 1) Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciation for &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; Chr(34) &amp;amp; thisLine &amp;amp; Chr(34) &amp;amp; &amp;quot;!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 2)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;addpron&amp;quot; Then Call Application.Alert(&amp;quot;Added pronunciations for &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;add&amp;quot; Then Call Application.Alert(&amp;quot;Added &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;remove&amp;quot; Then Call Application.Alert(&amp;quot;Removed &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If operation = &amp;quot;block&amp;quot; Then Call Application.Alert(&amp;quot;Blocked &amp;quot; &amp;amp; cWords &amp;amp; &amp;quot; words/phrases!&amp;quot;, &amp;quot;Speech Dictionary&amp;quot;, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Function CollapsePron(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = &amp;quot;&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 to Len(pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Not insideBrackets) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (Mid(pron, i, 1) = &amp;quot;[&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbTrue      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) &amp;lt;&amp;gt; &amp;quot;/&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ret = ret &amp;amp; Mid(pron, i, 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ElseIf (Mid(pron, i, 1) = &amp;quot;]&amp;quot;) Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; insideBrackets = vbFalse      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; CollapsePron = ret      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End Function      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Export ?the speech dictionary&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; fileName = &amp;quot;dictionary.txt&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lexToken = CreateObject(&amp;quot;SAPI.SpObjectToken&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; lexToken.SetId(&amp;quot;HKEY_CURRENT_USER\SOFTWARE\Microsoft\Speech\CurrentUserLexicon&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set lex = lexToken.CreateInstance()      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set words = lex.GetWords(1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set fso = CreateObject(&amp;quot;Scripting.FileSystemObject&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set file = fso.CreateTextFile(fileName, 1) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each word in words     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If (word.LangId = 1033) Then &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set prons = word.Pronunciations     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If prons.Count = 0 Then      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; vbCrLf&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For Each pron in prons      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write word.Word &amp;amp; &amp;quot;/&amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; If pron.PartOfSpeech = 61440 Then       &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write &amp;quot;BLOCKED&amp;quot; &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Else      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Write pron.Symbolic &amp;amp; vbCrLf      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; End If     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; file.Close      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Run(fileName)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Insert sounds like [...]&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like...&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set pc = CreateObject(&amp;quot;SAPI.SpPhoneConverter&amp;quot;)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pc.LanguageId = 1033 &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = &amp;quot;/&amp;quot;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; firstElement = Result.PhraseInfo.Properties.Item(0).FirstElement      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; numberOfElements = Result.PhraseInfo.Properties.Item(0).NumberOfElements &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; For i = 1 To numberOfElements     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Set elem = Result.PhraseInfo.Elements.Item(firstElement + i - 1)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; pron = pron &amp;amp; &amp;quot;[&amp;quot; &amp;amp; elem.LexicalForm &amp;amp; &amp;quot;]&amp;quot; &amp;amp; &amp;quot;/&amp;quot; &amp;amp; pc.IdToPhone(elem.Pronunciation) &amp;amp; &amp;quot; &amp;quot;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Next      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.Wait(0.25)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SetTextFeedback(&amp;quot;Sounds like: &amp;quot; &amp;amp; pron)      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.InsertText(pron) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;What's that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;What does that sound like&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;script language=&amp;quot;VBScript&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;![CDATA[ &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.SendKeys(&amp;quot;{250 WAIT}{{CTRL}}c{250 WAIT}&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; that = Application.clipboardData.GetData(&amp;quot;text&amp;quot;) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Go after that&amp;quot;)     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Application.EmulateRecognition(&amp;quot;Insert sounds like &amp;quot; &amp;amp; that) &lt;/p&gt;    &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ]]&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/script&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;Show phonemes&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;run command=&amp;quot;&lt;a href="http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx"/"&gt;http://msdn.microsoft.com/en-us/library/ms717239(VS.85).aspx&amp;quot;/&lt;/a&gt;&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;command&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;appIsInForeground processName=&amp;quot;notepad.exe&amp;quot; windowTitleContains=&amp;quot;dictionary.txt&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;listenFor&amp;gt;[operationPhrase] ?for that&amp;lt;/listenFor&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;emulateRecognition&amp;gt;{[operationPhrase]} that the speech dictionary&amp;lt;/emulateRecognition&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/command&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;#160; &amp;lt;listenForList name=&amp;quot;operationPhrase&amp;quot; propname=&amp;quot;operation&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pronunciation&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;addpron&amp;quot;&amp;gt;Add ?a pron&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;add&amp;quot;&amp;gt;Add&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Remove&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;block&amp;quot;&amp;gt;Block&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;item propval=&amp;quot;remove&amp;quot;&amp;gt;Unblock&amp;lt;/item&amp;gt;      &lt;br /&gt;&amp;#160; &amp;lt;/listenForList&amp;gt; &lt;/p&gt;    &lt;p&gt;&amp;lt;/speechMacros&amp;gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;That's it! I know this is a lot of script to digest, but if you don't really want to, don't! Just use the macro as is. Questions? Comments? &lt;a href="mailto:listen@microsoft.com?subject=Macro of the day: Speech Dictionary"&gt;Let us know&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8808773" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/robch/archive/tags/Speech+Recognition/default.aspx">Speech Recognition</category><category domain="http://blogs.msdn.com/robch/archive/tags/Development/default.aspx">Development</category><category domain="http://blogs.msdn.com/robch/archive/tags/Macros/default.aspx">Macros</category></item></channel></rss>