User Tools

Site Tools


speech_20synthesis_20_28lbb_29

Speech synthesis (LBB)

by Richard Russell, November 2015

The program below illustrates the use of the speak sub; it is compatible with both LB and LBB. Note that it is necessary to declare speechInit as global:

     ' LB speech synthesis without a helper DLL!
     ' by Richard Russell, 26-Mar-2012
 
     open "ole32.dll" for dll as #ole32
     calldll #ole32, "CoInitialize", 0 as long, r as long
     global speechInit
     do
       read phrase$
       print phrase$
       call speak phrase$
     loop until phrase$ = ""
     calldll #ole32, "CoUninitialize", r as long
     close #ole32
     end
 
     data "This is a demonstration of speech synthesis"
     data "using Liberty BASIC code without a helper DLL"
     data ""
 
     ' Text-to-speech subroutine, using the SAPI5 speech engine, by Richard Russell
 
     sub speak text$
 
     if speechInit = 0 then
       struct clsid, a as long, b as long, c as long, d as long
       clsid.a.struct = hexdec("96749377") : clsid.b.struct = hexdec("11D23391")
       clsid.c.struct = hexdec("C000E39E") : clsid.d.struct = hexdec("9673794F")
 
       struct iid, a as long, b as long, c as long, d as long
       iid.a.struct = hexdec("6C44DF74") : iid.b.struct = hexdec("499272B9")
       iid.c.struct = hexdec("99EFECA1") : iid.d.struct = hexdec("D422046E")
 
       struct voice, v as long
       struct temp, v as long
       calldll #ole32, "CoCreateInstance", clsid as struct, 0 as long, 5 as long, _
                                           iid as struct, voice as struct, r as long
       if voice.v.struct = 0 then notice "SAPI5 is not available" : end
       speechInit = 1
     end if
 
     length = len(text$)+1
     wtext$ = space$(length*2)
     calldll #kernel32, "MultiByteToWideChar", 0 as long, 0 as long, text$ as ptr, _
                        -1 as long, wtext$ as ptr, length as ulong, r as long
 
     pvoice = voice.v.struct
     temp.struct = pvoice
     pspeak = temp.v.struct + 80
     temp.struct = pspeak
     speak = temp.v.struct
     temp.struct = pvoice
 
     calldll #user32, "CallWindowProcA", speak as long, pvoice as long, _
                      wtext$ as ptr, 0 as long, 0 as long, r as long
     end sub

The default voice is used; it may be a male or female voice depending on the version of Windows. If you prefer to specify the gender (assuming both a male and a female voice are installed, which may not always be the case) you can insert 'tags' in the string to achieve that:

     data "<voice optional='gender=female'>This is a demonstration of speech synthesis</voice>"
     data "<voice optional='gender=male'>using Liberty BASIC code without a helper DLL</voice>"
     data ""

It is also possible to control the speed and the volume in a similar way:

     data "<rate absspeed = '4'>This is a demonstration of speech synthesis</rate>"
     data "<volume level = '50'>using Liberty BASIC code without a helper DLL</voice>"
     data ""

The speed should be specified as a value between -10 and +10, and the volume as a value between 0 and 100.

This alternative format for the tags may also be used:

     data "<rate absspeed = '4'/>This is a demonstration of speech synthesis"
     data "<volume level = '50'/>using Liberty BASIC code without a helper DLL"
     data ""


If you want to select a specific SAPI5 voice (and you know it is installed on your PC) you can do that as follows:

     data "<voice required='name=IVONA 2 Brian OEM'>This is a demonstration of speech synthesis</voice>"

In this case the voice selected is Ivona Brian (a British English male voice) which can be purchased from http://www.textaloud.com/

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
speech_20synthesis_20_28lbb_29.txt · Last modified: 2024/01/05 00:21 by 127.0.0.1