Sprachausgabe mit SAPI



  • Hi,
    bin auf der Suche nach Beispielcode für eine Beispiel TTS ENGINE.
    Ich bin mir bewußt das man seine eigene Engine nich so ohne weiteres schreibt!
    Es geht nur um die prinzipielle vorgehensweise bzw. die Weitergabe der SAPI befehle an die bereits fertige Sprachausgabe(20 wörter). Das Sprechen und Stoppen klappt ja auch nur Pause, Resume, setvolume setrate funktionieren noch nicht. Ich weiß nicht an welcher Stelle ich diese im Code abgreifen kann.

    STDMETHODIMP Engine::Speak( DWORD dwSpeakFlags,
                                    REFGUID rguidFormatId,
                                    const WAVEFORMATEX * pWaveFormatEx,
                                    const SPVTEXTFRAG* pTextFragList,
                                    ISpTTSEngineSite* pOutputSite )
    {
        //SPDBG_FUNC( "Engine::Speak" );
    	//char* buffer;// Vektor zur Aufnahme der Daten
        HRESULT hr = S_OK;
    
    	//--- Check args
    	if( SP_IS_BAD_INTERFACE_PTR( pOutputSite ) ||
    			(SP_IS_BAD_READ_PTR( pTextFragList )))
    	{
           	return  E_INVALIDARG;
    	}
    
    	else
    	{
    		// OLLI Stimme wird initialisiert
    		OLLI.newSession();
    		OLLI.newInstance();
    		OLLI.newVoice();
    
    		OLLI.setAudio();
    
    			m_pCurrFrag   = pTextFragList;
    			m_pNextChar   = m_pCurrFrag->pTextStart;
    			m_pEndChar    = m_pNextChar + m_pCurrFrag->ulTextLen;
    			m_ullAudioOff = 0;
    			buffer = new char[(long)m_pEndChar * sizeof(char)+1];
    
    			if(buffer ==NULL)
    			{
    				return E_FAIL;
    			}
    			ConvertToMultiByte(m_pNextChar,buffer,(long)m_pEndChar);
    
    		OLLI.readSlice(buffer);
    		while(SUCCEEDED (hr) && !(pOutputSite->GetActions() &SPVES_ABORT))
    		{
    
    			if ((pOutputSite->GetActions()& SPVES_ABORT)||
    			(!OLLI.done()))
    			{
    				OLLI.read("     ");//<<----HACKXX 
    				//OLLI.stop();
    				break;
    
    			}
    
    			hr=	OLLI.readSlice();
    			if ((pOutputSite->GetActions() & SPVES_VOLUME))
    
    			{
    				USHORT volume; //
    				GetVolume(&volume);
    
    			}
    		}
    
    //end
    		OLLI.deleteVoice();
    		delete buffer;
    				buffer =0;
    		if(hr==S_FALSE)
    		{
    

    Ich denke das ich die Virtuellen methoden einfach überschreiben muss ( so wie in Speak) oder liege ich damit falsch??

    Wäre nett wenn mir jemand helfen könnte.

    vielen Dank

    olli


Anmelden zum Antworten