none
SAPI SynthesizerState.Ready RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte gerne erreichen, dass meine Sprachausgabe einen Text ansagt, wenn der eigentliche Text fertig gesprochen wurde.

    Auf meiner Suche bin ich auf die SynthesizerState Funktion gestoßen und habe mir folgenden Code gebastelt. Der steht in einem Timer in der Hoffnung, dass bei der Überprüfung festgestellt wird, dass der Synthesizer nun fertig ist.

    Beim Programmablauf bleibt das Programm allerdings bereits bei der If-Anweisung hängen.

       If SAPI.SynthesizerState.Ready Then
                SAPI.Voice = SAPI.GetVoices().Item(Configuration.Cbo_Voice.SelectedIndex)
                SAPI.Volume = Configuration.Tb_Volume.Value
                SAPI.Rate = Configuration.Tb_SpeedRate.Value
                SAPI.Speak(EndOfDocument, SpeechLib.SpeechVoiceSpeakFlags.SVSFlagsAsync)
            End If

    Ist denn der Aufruf "SAPI.SynthesizerState.Ready" korrekt?  Davor hatte ich es mit "SAPI.SynthesizerState.Ready = True" versucht, aber auch da blieb die Anwendung hängen.

    Weiß jemand wie es korrekt ist?


    Liebe Grüße Stefan

    Mittwoch, 11. September 2019 10:10

Antworten

Alle Antworten

  • Hallo Stefan,

    ich kann dir das an dem Beispiel zeigen, dass ich dir vor ein paar Wochen geschrieben hatte.

    Dort ist das EndStream Event dasjenige, dass Du abgreifen müsstest.

    Imports SpeechLib.SpeechVoiceSpeakFlags
    
    Public Class Form1
    
        Private WithEvents SpeechLib As SpeechLib.SpVoice
        Private Property OutputDefaultText As Boolean = False
    
        Private Sub Form_Load() Handles Me.Load
    
            SpeechLib = New SpeechLib.SpVoice()
    
        End Sub
    
        Private Sub Form_Close() Handles Me.Closing
    
            SpeechLib = Nothing
    
        End Sub
    
        Private Sub StartOutput_Click(sender As Object, e As EventArgs) Handles StartOutput.Click
    
            SpeechLib.Speak( Input.Text, SVSFlagsAsync )
    
        End Sub
    
    
        Private Sub SpeechLib_Word( ByVal StreamNumber As Long, ByVal StreamPosition As Object, ByVal CharacterPosition As Int32, ByVal Length As Int32 ) Handles SpeechLib.Word
    
            If Not OutputDefaultText Then
                Input.HideSelection   = False
                Input.SelectionStart  = CharacterPosition
                Input.SelectionLength = Length
            End If
    
        End Sub
    
        Private Sub SpeechLib_EndStream( StreamNumber As Integer, StreamPosition As Object ) Handles SpeechLib.EndStream
    
            If Not OutputDefaultText Then
                OutputDefaultText = True
                SpeechLib.Speak( "Das ist das Ende", SVSFlagsAsync )
            Else
                OutputDefaultText = False
            End If
    
        End Sub
    
    End Class


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport

    Mittwoch, 11. September 2019 12:18
    Moderator
  • Hallo Stefan,

    das habe ich jetzt mal in meinen Timer reingepackt und bekomme da wiederholt die Ansage sobald mein Text in der Textbox auftaucht aber noch nicht gesprochen wird.

    Das trifft es also nicht zu 100% bzw. muss ich sehen, wie ich das an meine Anwendung anpasse. Ich glaubte mich zu erinnern, dass es auch so was wie Sapi.Completed gibt. Wäre das das gleiche?


    Liebe Grüße Stefan

    Mittwoch, 11. September 2019 15:24
  • Hallo Stefan,

    was willst Du nur immer mit deinen Timern?

    Das Ereignis EndStream wird automatisch aufgerufen, wenn der Speak Aufruf durch ist. Da brauchst Du keinen Timer.

    Zudem weiß ich ehrlich nicht, was Du da verwendest. Ich habe die SpVoice Klasse aus der Microsoft Speec Object Library 5.4 verwendet. Evtl. solltest Du das auch mal machen und dann die Doku dazu lesen.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET (2001-2018)
    https://www.asp-solutions.de/ - IT Beratung, Softwareentwicklung, Remotesupport


    Mittwoch, 11. September 2019 15:26
    Moderator