Hallo!
Ich kenne mich auf dem gebiet war nicht "sehr gut" aus, aber trotzdem versuche ich mal weiter
zu helfen. Ich hab mir nur das SAPI5-SDK "oberflächlich" angeschaut und etwas experimentiert.
Problem ist nur, daß man bei SAPI5 nicht viel Vor-Konfigurieren kann. Jedenfalls nicht so toll wie
beim alten SAPI4, was jedoch kaum noch von den Stimmen-Herstellern supportet wird. Dafür
ist die SAPI5 Programmierung relativ simpel gestrickt, damit solche Einstellungen schnell
erledigt sind.
Ich weiß ja nicht, wie die SAPI5 in Phoner angesprochen wird. Ich nehme jedoch an, wie üblich
über ein COM-Objekt. So wird es jedenfalls im SAPI5-SDK gezeigt, welches auf der MS-Homepage
downlodbar ist. Dort ist SAPI5 auch ausreichend
Dokumentiert.
In Visual Basic sieht das so aus (ich poste hier nicht den ganzen Source, nur ein Teil als
Beispiel. Der Original-Source befindet sich im SAPI5-SDK. Dort ist er für Visual Basic
sowie für Visual C und als Beispiel für HTML-Einbindung enthalten):
' First, declare the main SAPI object we are using in this sample. It is
' created inside Form_Load and released inside Form_Unload.
Dim WithEvents Voice As SpVoice
' Speak flags is a combination of bit flags. These individual bits correspond
' to check boxes on the UI. So speakFlags should always be kept in sync
' with the state of those check boxes.
Dim speakFlags As SpeechVoiceSpeakFlags
' This is the default format we will use.
'Const DefaultFmt = "SAFT22kHz16BitMono"
Const DefaultFmt = "22kHz, 16Bit, Mono"
'Initialisiert SAPI5
Sub SpeechInit()
'Creates the voice object first
Set Voice = New SpVoice
'Load the voices combo box
Dim Token As ISpeechObjectToken
For Each Token In Voice.GetVoices
coVoice.AddItem (Token.GetDescription())
Next
coVoice.ListIndex = 0
'load the format combo box
AddItemToFmtCB
'set rate and volume to the same as the Voice
hsRate.Value = Voice.Rate
hsVolume.Value = Voice.Volume
'set the default format
coFormat.Text = DefaultFmt
'Load the audio output combo box
If Voice.GetAudioOutputs.Count > 0 Then
For Each Token In Voice.GetAudioOutputs
coDevice.AddItem (Token.GetDescription)
Next
Else
coDevice.AddItem NoAudioOutput
coDevice.Enabled = False
End If
coDevice.ListIndex = 0
'init speak flags and sync flag check boxes
speakFlags = SVSFlagsAsync Or SVSFPurgeBeforeSpeak Or SVSFIsXML
chkSpFlagAync.Value = Checked
chkSpFlagPurgeBeforeSpeak.Value = Checked
chkSpFlagIsXML.Value = Checked
SetSpeakingState False, False
End Sub
'Definiert Format-String und Format-Constante für die Combo-Box
'Die Constanten sind vom COM-Object fest vorgegeben und fangen
'jedweils mit SAFT* an. Die Stereo-Formate kann man theoretisch
'weglassen. In Google habe ich keine TTS mit Stereo-Support
'gefunden (wozu auch?), daher alle Auskommentiert.
Private Sub AddItemToFmtCB()
AddFmts " 8kHz, 8Bit, Mono", SAFT8kHz16BitMono
'AddFmts " 8kHz, 8Bit, Stereo", SAFT8kHz8BitStereo
AddFmts " 8kHz, 16Bit, Mono", SAFT8kHz16BitMono
'AddFmts " 8kHz, 16Bit, Stereo", SAFT8kHz16BitStereo
AddFmts "11kHz, 8Bit, Mono", SAFT11kHz8BitMono
'AddFmts "11kHz, 8Bit, Stereo", SAFT11kHz8BitStereo
AddFmts "11kHz, 16Bit, Mono", SAFT11kHz16BitMono
'AddFmts "11kHz, 16Bit, Stereo", SAFT11kHz16BitStereo
AddFmts "12kHz, 8Bit, Mono", SAFT12kHz8BitMono
'AddFmts "12kHz, 8Bit, Stereo", SAFT12kHz8BitStereo
AddFmts "12kHz, 16Bit, Mono", SAFT12kHz16BitMono
'AddFmts "12kHz, 16Bit, Stereo", SAFT12kHz16BitStereo
AddFmts "16kHz, 8Bit, Mono", SAFT16kHz8BitMono
'AddFmts "16kHz, 8Bit, Stereo", SAFT16kHz8BitStereo
AddFmts "16kHz, 16Bit, Mono", SAFT16kHz16BitMono
'AddFmts "16kHz, 16Bit, Stereo", SAFT16kHz16BitStereo
AddFmts "22kHz, 8Bit, Mono", SAFT22kHz8BitMono
'AddFmts "22kHz, 8Bit, Stereo", SAFT22kHz8BitStereo
AddFmts "22kHz, 16Bit, Mono", SAFT22kHz16BitMono
'AddFmts "22kHz, 16Bit, Stereo", SAFT22kHz16BitStereo
AddFmts "24kHz, 8Bit, Mono", SAFT24kHz8BitMono
'AddFmts "24kHz, 8Bit, Stereo", SAFT24kHz8BitStereo
AddFmts "24kHz, 16Bit, Mono", SAFT24kHz16BitMono
'AddFmts "24kHz, 16Bit, Stereo", SAFT24kHz16BitStereo
AddFmts "32kHz, 8Bit, Mono", SAFT32kHz8BitMono
'AddFmts "32kHz, 8Bit, Stereo", SAFT32kHz8BitStereo
AddFmts "32kHz, 16Bit, Mono", SAFT32kHz16BitMono
'AddFmts "32kHz, 16Bit, Stereo", SAFT32kHz16BitStereo
AddFmts "44kHz, 8Bit, Mono", SAFT44kHz8BitMono
'AddFmts "44kHz, 8Bit, Stereo", SAFT44kHz8BitStereo
AddFmts "44kHz, 16Bit, Mono", SAFT44kHz16BitMono
'AddFmts "44kHz, 16Bit, Stereo", SAFT44kHz16BitStereo
AddFmts "48kHz, 8Bit, Mono", SAFT48kHz8BitMono
'AddFmts "48kHz, 8Bit, Stereo", SAFT48kHz8BitStereo
AddFmts "48kHz, 16Bit, Mono", SAFT48kHz16BitMono
'AddFmts "48kHz, 16Bit, Stereo", SAFT48kHz16BitStereo
End Sub
'Fügt die Formate in die ComboBox ein.
Private Sub AddFmts(ByRef name As String, ByVal fmt As SpeechAudioFormatType)
Dim Index As String
'get the count of existing list so that we are adding to the bottom of the list
aIndex = coFormat.ListCount
'add the name to the list box and associate the format type with the item
coFormat.AddItem name, aIndex
coFormat.ItemData(aIndex) = fmt
End Sub
'Beim Klick auf die ComboBox (enthält Liste der Formate) wird die
'Format-Konstante an das Objekt übergeben
Private Sub coFormat_Click()
On Error GoTo ErrHandler
'Note: AllowAudioOutputFormatChangesOnNextSet is a hidden property, VB
'object browser doesn't show it by default. To see it, you can go to
'VB object viewer, right click and turn on the "show hidden members".
Voice.AllowAudioOutputFormatChangesOnNextSet = False
'The format Type is associated with the selected list item as a long.
Voice.AudioOutputStream.Format.Type = coFormat.ItemData(coFormat.ListIndex)
'Currently you have to call this so that SAPI picks up the new format.
Set Voice.AudioOutputStream = Voice.AudioOutputStream
Exit Sub
ErrHandler:
AddDebugInfo "Set format error: ", Err.Description
End Sub
'Beim ändern des Lautstärke-Schieberegler (Wert: 0-100)
'wird der eingestellte Wert übergeben
Private Sub hsVolume_Change()
Voice.Volume = hsVolume.Value
End Sub
'Beim ändern des Geschwindigkeits-Schieberegler (Wert: -10 bis +10)
'wird der eingestellte Wert übergeben
Private Sub hsRate_Change()
Voice.Rate = hsRate.Value
End Sub
TIP:
Wer SAPI5 nicht nur in Windows XP/Vista benutzen will und sich scheut rund 100 MB des SAPI5-SDK
runterzuladen, kann sich die SAPI5-API (rund 6 MB) ausm Netz saugen (nach "sapi51.msi" suchen).
Es steht immer dabei, daß sie ausschließlich für Windows 2000 wäre, aber ich habe sie auch erfolgreich
auf einem alten PC in Windows 98 zum laufen gebracht (vorrausgesetzt aktueller MSI-Installer vorhanden).
So, ich hoffe das waren genug Informationen für Heute ...
MfG,
Dr.InSide