Problem with win32ole, sapi5

Hi all,

Ruby 1.8.4 (both installer and hand built)
win32-sapi 0.1.3

Why does my attempt to set the voice fail?

C:\eclipse\workspace\win32-sapi>c:\ruby184\bin\irb
irb(main):001:0> require ‘win32/sapi5’
=> true
irb(main):002:0> include Win32
=> Object
irb(main):003:0> v = SpVoice.new
=> #Win32::SpVoice:0x2bffe70
irb(main):004:0> hash = {}
=> {}
irb(main):005:0> v.getvoices.each{ |voice|
hash[File.basename(voice.Id)] = voice }
=> nil
irb(main):006:0> hash
=> {“MSMary”=>#WIN32OLE:0x2bf1c20, “MSSam”=>#WIN32OLE:0x2bf1ce0,
“SampleTTSVoice”=>#WIN32OLE:0x2bf1b90, “MSMike”=>
#WIN32OLE:0x2bf1cb0}
irb(main):007:0> v.voice = hash[“MSMary”]
WIN32OLERuntimeError:
OLE error code:0 in

HRESULT error code:0x80020003
Member not found.
from (irb):8:in `method_missing’
from (irb):8

I also tried v.setproperty(“voice”,hash[“MSMary”]) but got the same
result.

Any ideas?

Thanks,

Dan

Hi,

Does anyone have any input on this old post? I’m having the same
problem, but I can’t find any response to the post anywhere. Basically
it seems that win32ole doesn’t discover that SpVoiceInstance.Voice is
both a gettable and settable property:

irb(main):053:0> Win32::SpVoice.new.ole_get_methods
=> [Status, Voice, AudioOutput, AudioOutputStream, Rate, Volume,
AllowAudioOutpu
tFormatChangesOnNextSet, EventInterests, Priority, AlertBoundary,
SynchronousSpe
akTimeout]
irb(main):054:0> Win32::SpVoice.new.ole_put_methods
=> [Rate, Volume, AllowAudioOutputFormatChangesOnNextSet,
EventInterests, Priori
ty, AlertBoundary, SynchronousSpeakTimeout]
irb(main):055:0>

Is this a bug? The following is valid VB source code:

Set V.Voice = V.GetVoices().Item(List1.ListIndex)

So I’d expect something like this to work:

require ‘win32/sapi5’
v = Win32::SpVoice.new
v[‘Voice’] = v.GetVoices.Item(1)

But it doesn’t. I’ve tried all possible variants I can think of from the
documentation:

v.Voice = …
v.voice = …
v.Voice(…)
v.voice(…)
v[‘voice’] = …
v[‘Voice’] = …
v.setproperty(‘voice’, …)
v.setproperty(‘Voice’, …)

Basically I’d really love to get this to work properly. This weeks Ruby
Quiz inspired me to give a go at a “personal trainer” for my treadmill
sessions here at home. For now I’ve settled for a tiny VB .NET command
line app that sets the voice I want, and takes text as an argument. I’d
really love to have an all Ruby solution for this though.

Regards,
Helge E.

Daniel B. wrote:

Hi all,

Ruby 1.8.4 (both installer and hand built)
win32-sapi 0.1.3

Why does my attempt to set the voice fail?

C:\eclipse\workspace\win32-sapi>c:\ruby184\bin\irb
irb(main):001:0> require ‘win32/sapi5’
=> true
irb(main):002:0> include Win32
=> Object
irb(main):003:0> v = SpVoice.new
=> #Win32::SpVoice:0x2bffe70
irb(main):004:0> hash = {}
=> {}
irb(main):005:0> v.getvoices.each{ |voice|
hash[File.basename(voice.Id)] = voice }
=> nil
irb(main):006:0> hash
=> {“MSMary”=>#WIN32OLE:0x2bf1c20, “MSSam”=>#WIN32OLE:0x2bf1ce0,
“SampleTTSVoice”=>#WIN32OLE:0x2bf1b90, “MSMike”=>
#WIN32OLE:0x2bf1cb0}
irb(main):007:0> v.voice = hash[“MSMary”]
WIN32OLERuntimeError:
OLE error code:0 in

HRESULT error code:0x80020003
Member not found.
from (irb):8:in `method_missing’
from (irb):8

I also tried v.setproperty(“voice”,hash[“MSMary”]) but got the same
result.

Any ideas?

Thanks,

Dan

Helge E. wrote:

Hi,

Does anyone have any input on this old post? I’m having the same
problem, but I can’t find any response to the post anywhere. Basically
it seems that win32ole doesn’t discover that SpVoiceInstance.Voice is
both a gettable and settable property

I think it’s a bug in win32ole. I recommend submitting a report on the
RubyForge bug tracker for Ruby.

  • Dan

Hello,
In message “Re: Problem with win32ole, sapi5”
on 06/06/13, Masaki S. [email protected] writes:

irb(main):055:0>

Is this a bug? The following is valid VB source code:

Set V.Voice = V.GetVoices().Item(List1.ListIndex)

Sorry, this is a bug of Win32OLE.
But please give me some time to fix it.

I have fixed it in Ruby 1.8.4 latest CVS snapshot.
The following script works fine.

require ‘win32/sapi5’
v = Win32::SpVoice.new
v.voice = v.getvoices.item(2)

Regards,
Masaki S.

Masaki S. wrote:

irb(main):054:0> Win32::SpVoice.new.ole_put_methods

I have fixed it in Ruby 1.8.4 latest CVS snapshot.
The following script works fine.

require ‘win32/sapi5’
v = Win32::SpVoice.new
v.voice = v.getvoices.item(2)

Regards,
Masaki S.

Excellent! I have at least one blind user who will be very happy to
hear it. :slight_smile:

Thanks,

Dan

Hello, Sorry for being too late to reply.

In message “Re: Problem with win32ole, sapi5”
on 06/06/13, Helge E. [email protected] writes:

akTimeout]
irb(main):054:0> Win32::SpVoice.new.ole_put_methods
=> [Rate, Volume, AllowAudioOutputFormatChangesOnNextSet,
EventInterests, Priori
ty, AlertBoundary, SynchronousSpeakTimeout]
irb(main):055:0>

Is this a bug? The following is valid VB source code:

Set V.Voice = V.GetVoices().Item(List1.ListIndex)

Sorry, this is a bug of Win32OLE.
But please give me some time to fix it.

Regards,
Masaki S.