一个基于WinCE平台的语音朗读例子,利用微软speechAPI5.0

#include "stdafx.h"
#include "atlbase.h"
#include <sphelper.h>

int _tmain(int argc, TCHAR* argv[])
{
    HRESULT hr=S_FALSE;
    WCHAR wcBuff[MAX_PATH];
    int i;

    if( argc < 2 )
    {
        //--- Give out a helpstring
        wcscpy( wcBuff, L"This is a simple sample sentence." );
    }
    else
    {
  for( i = 1, wcBuff[0] = 0; i < argc; ++i )
  {
   wcscat( wcscat( wcBuff, argv[i] ), L" " );
  }
    }

    if( SUCCEEDED( hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ) ) )
    {
        //--- Create the voice
        CComPtr<ISpVoice> cpVoice;
        hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
        if( SUCCEEDED( hr ) )
        {
            hr = cpVoice->Speak(wcBuff, 0, NULL);
//            if( SUCCEEDED( hr ) )
//            {
//                hr = cpVoice->WaitUntilDone(INFINITE);
//            }
        }
        if (cpVoice)
            cpVoice.Release();

        CoUninitialize();
    }

 if (FAILED(hr)) return 1;
 return 0;
}

 

 

 

 

//--- Includes --------------------------------------------------------------

#include <windows.h>
#include <stdio.h>
#include <atlbase.h>
#include <shellapi.h>
#include <sapi.h>

//--- Const Defines----------------------------------------------------------

const static WCHAR g_szMarkupDemo[] =
    L"<VOICE OPTIONAL=/"Female/">Tags can be used to change attributes such as/n"
    L"    <VOICE OPTIONAL=/"Gender=Male;Volume=Loud/">the voice font that is used,</VOICE>/n"
    L"    the <VOLUME LEVEL=/"65/">volume of the voice</VOLUME>/n"
    L"    and other attributes of speech such as pitch and rate./n"
    L"</VOICE>/n/n";


/****************************************************************************
* MixWithWav *
*------------*
*   Description:
*       Plays an introductory audio file followed by synthetic speech.
*
*   Returns:
*       HRESULT from Speak call or
*       S_FALSE if the Intro.Wav file is not present
*
*****************************************************************************/

HRESULT MixWithWav(ISpVoice * pVoice)
{
    HRESULT hr = S_OK;
#ifndef _WIN32_WCE
    wprintf(L"Now a sample of mixed wave files and generated speech./n/n");
#else
    OutputDebugString(L"Now a sample of mixed wave files and generated speech./n/n");
#endif
    hr = pVoice->Speak(L"Intro.Wav", SPF_IS_FILENAME | SPF_ASYNC, NULL);
    if (hr == STG_E_FILENOTFOUND)
    {
#ifndef _WIN32_WCE
        wprintf(L"ERROR:  Can not find file Intro.Wav.  Wave file mixing sample will be skipped./n/n");
#else
        OutputDebugStringW(L"ERROR:  Can not find file Intro.Wav.  Wave file mixing sample will be skipped./n/n");
#endif
        hr = S_FALSE;   // Return success code so sample will continue...
    }
    else
    {
        if (SUCCEEDED(hr))
        {
            hr = pVoice->Speak(L"<VOICE OPTIONAL=/"Male/">one hundred eighty dollars and twenty seven cents.</VOICE>", 0, NULL );
        }
    }
    return hr;
}

/****************************************************************************
* CreateSampleFile *
*------------------*
*   Description:
*       Creates a file named Created.Wav using a TTS voice and then starts
*   the currently registered audio playback application.
*
*   Returns:
*       HRESULT
*
*****************************************************************************/

HRESULT CreateSampleFile(ISpVoice * pVoice)
{
    HRESULT hr = S_OK;
    CComPtr<ISpStream> cpWavStream;
    WAVEFORMATEX wfex;
    wfex.wFormatTag = WAVE_FORMAT_PCM;
    wfex.nChannels = 1;
    wfex.nSamplesPerSec = 22050;
    wfex.nAvgBytesPerSec = 22050 * 2;
    wfex.nBlockAlign = 2;
    wfex.wBitsPerSample = 16;
    wfex.cbSize = 0;
    hr = cpWavStream.CoCreateInstance(CLSID_SpStream);
    if (SUCCEEDED(hr))
    {
        hr = cpWavStream->BindToFile(L"Created.Wav", SPFM_CREATE_ALWAYS, &SPDFID_WaveFormatEx, &wfex, 0);
    }
    if (SUCCEEDED(hr))
    {
        hr = pVoice->SetOutput(cpWavStream, TRUE);
    }
    if (SUCCEEDED(hr))
    {
        hr = pVoice->Speak( L"This audio file was created using SAPI five text to speech.", 0, NULL);
        pVoice->SetOutput(NULL, TRUE);
    }
    if (SUCCEEDED(hr))
    {
        hr = cpWavStream->Close();
    }
    if (SUCCEEDED(hr))
    {
#ifndef _WIN32_WCE
        printf("Now I'll start the media player on the created file...");
#else
        OutputDebugString(L"Now I'll start the media player on the created file...");
#endif

#ifndef _WIN32_WCE
        pVoice->Speak( L"Press the play button to play the recorded audio.", 0, NULL);
        ::ShellExecute(NULL, "open", _T("Created.Wav"), NULL, NULL, SW_SHOWNORMAL);
#endif
    }
    return hr;
}

/****************************************************************************
* SpeakWithEvents *
*-----------------*
*   Description:
*       Speaks the provided text string and displays the words when the
*   they are spoken.
*
*   Returns:
*       HRESULT
*
*****************************************************************************/

HRESULT SpeakWithEvents(ISpVoice * pVoice, const WCHAR * psz)
{
    HRESULT hr = S_OK;
    hr = pVoice->SetInterest(SPFEI(SPEI_WORD_BOUNDARY) | SPFEI(SPEI_END_INPUT_STREAM), 0);
    if (SUCCEEDED(hr))
    {
        hr = pVoice->Speak(psz, SPF_ASYNC, NULL);
    }
    ULONG i = 0;
    bool fDone = false;
    while (SUCCEEDED(hr) && (!fDone))
    {
        hr = pVoice->WaitForNotifyEvent(INFINITE);
        if (SUCCEEDED(hr))
        {
            SPVOICESTATUS Stat;
            hr = pVoice->GetStatus(&Stat, NULL);
            if (SUCCEEDED(hr) && (Stat.dwRunningState & SPRS_DONE) == 0)
            {
                while (i < Stat.ulInputWordPos + Stat.ulInputWordLen)
                {
#ifndef _WIN32_WCE
                    putwchar(psz[i++]);
#else
                    WCHAR wsz[2];
                    wsz[0] = psz[i++];
                    wsz[1] = 0;
                    OutputDebugStringW(wsz);
#endif
                }
            }
            else
            {
#ifndef _WIN32_WCE
                wprintf(L"%s/n/n", psz + i);
#else
                RETAILMSG(TRUE,(L"%s/n/n", psz + i));
#endif
                fDone = true;
            }
        }
    }
    return hr;
}

/****************************************************************************
* main *
*------*
*   Description:
*       Entry point for sample program
*
*   Returns:
*       HRESULT
*
*****************************************************************************/

int _tmain(int argc, TCHAR* argv[])
{
    HRESULT hr;
#ifndef _WIN32_WCE
    wprintf(L"SAPI 5.0 Sample TTS Application/n/n");
#else
    OutputDebugString(L"SAPI 5.0 Sample TTS Application/n/n");
#endif
    hr = ::CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if(SUCCEEDED(hr))
    {
        CComPtr<ISpVoice> cpVoice;
        hr = cpVoice.CoCreateInstance(CLSID_SpVoice);
        if (SUCCEEDED(hr))
        {
            hr = cpVoice->Speak(L"This sample program uses basic text to speech operations.", 0, NULL);
        }
        if (SUCCEEDED(hr))
        {
#ifndef _WIN32_WCE
            wprintf(g_szMarkupDemo);
#else
            OutputDebugString(g_szMarkupDemo);
#endif
            hr = cpVoice->Speak(g_szMarkupDemo, 0, NULL);
        }
        if (SUCCEEDED(hr))
        {
            hr = SpeakWithEvents(cpVoice, L"This is a demonstration of how words can be displayed when they are spoken.");
        }
        if (SUCCEEDED(hr))
        {
            hr = MixWithWav(cpVoice);
        }
        if (SUCCEEDED(hr))
        {
            hr = CreateSampleFile(cpVoice);
        }
        cpVoice.Release();  // Must release prior to CoUninitialize or we'll GP Fault
        CoUninitialize();
    }
    if (FAILED(hr))
    {
#ifndef _WIN32_WCE
        wprintf(L"Sample program failed with error code 0x%x/n", hr);
#else
        RETAILMSG(TRUE,(L"Sample program failed with error code 0x%x/n", hr));
#endif
    }
 return hr;
}

 

需要的留下Email,我给大家发

你可能感兴趣的:(File,null,微软,平台,WinCE,attributes)