//****************************************************************************** // Copyright (c) Microsoft Corporation. All rights reserved. // ttsmarkup.cpp // //****************************************************************************** #include "TTSComp.h" //****************************************************************************** //***** Internal Functions //****************************************************************************** #include "f0.h" int ComputeF0 (float* data, int nData, int sampFreq, int minF0, int maxF0, int feaSampFreq, float** f0, int* nF0, float **pRms, int *nRms) { char parStr[128]; F0Data f0Obj = NULL; F0Out f0Frame; int buffSize; int buffStep; int nFrames; int remainder; int nOutput; int outSampNum; int i; int j; // assert (data); // assert (nData>0); // assert (sampFreq); // assert (feaSampFreq); // assert (f0); /* * Create and initialize the f0 object */ if ((f0Obj = F0_NewF0Obj ()) == NULL) { goto error; } sprintf (parStr ,"frame_step=%f", 1.0/feaSampFreq); if (!F0_ParseParameter (f0Obj, parStr)) { goto error; } sprintf (parStr ,"min_f0=%f", (float)minF0); if (!F0_ParseParameter (f0Obj, parStr)) { goto error; } sprintf (parStr ,"max_f0=%f", (float)maxF0); if (!F0_ParseParameter (f0Obj, parStr)) { goto error; } if (!F0_Init (f0Obj, sampFreq, &buffSize, &buffStep)) { goto error; } /* * Prepare memory for output */ *nF0 = *nRms = (int) (((nData / (float)sampFreq) * feaSampFreq) + 0.5); *f0 = NULL; *pRms = NULL; if ( (*f0 = (float *) malloc(*nF0 * sizeof(**f0))) == NULL) { goto error; } if ( (*pRms = (float *) malloc(*nRms * sizeof(**pRms))) == NULL) { goto error; } /* * Start processing */ nFrames = (nData - buffSize) / buffStep + 1; remainder = nData - nFrames*buffStep; outSampNum = 0; /* Iterate over number of frames*/ for (i = 0; i cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLBookmark_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLBookmark_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test passes a Bookmark through XML marked up text to a TTS engine and checks // to make sure a SPFEI_BOOKMARK event has fired. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; BOOL bGetEvents = true; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; DWORD dwEventsRetrieved = 0; WCHAR szwBmk[MAX_PATH]=L""; if( SUCCEEDED( hr ) ) { hr = cpVoice->SetNotifyWin32Event(); } if( SUCCEEDED( hr ) ) { hr = cpVoice->SetInterest( SPFEI(SPEI_TTS_BOOKMARK), SPFEI(SPEI_TTS_BOOKMARK) ); } //clean up the event queue while( hr == S_OK ) { SPEVENT Event; hr = cpVoice->GetEvents (1, &Event, NULL); } CHECKHRId( hr, tpr, IDS_STRING120 ); if( SUCCEEDED( hr ) ) { GetWStrFromRes( IDS_STRING20, szwSpeakStr ); hr = cpVoice->Speak( szwSpeakStr, SPF_ASYNC | SPF_IS_XML, NULL ); } if( SUCCEEDED( hr ) ) { hr = cpVoice->WaitUntilDone( TTS_WAITTIME ); CHECKASSERTGOTOIdEx( (hr == S_OK), tpr, IDS_STRING61, " in t_XMLBookmarkTest"); } while( hr == S_OK ) { SPEVENT Event; hr = cpVoice->GetEvents (1, &Event, NULL); if( hr == S_OK ) { // Record the events retrieved in dwFlagsRetrieved dwEventsRetrieved |= (DWORD)Event.eEventId; if (Event.eEventId == SPEI_TTS_BOOKMARK ) { //swprintf( szwBmk, L"%s, %d", (WCHAR*)Event.lParam, Event.wParam ); //g_pKato->Comment(10, szwBmk); //verify bookmark string (lparam and wparam) GetWStrFromRes( IDS_STRING21, szwDebug ); CHECKASSERTGOTOId(( !wcscmp( (WCHAR*)Event.lParam, szwDebug ) ), tpr, IDS_STRING22); CHECKASSERTGOTOId(( Event.wParam == _wtol(szwDebug) ), tpr, IDS_STRING22); break; } } } // Logging info CHECKHRId( hr, tpr, IDS_STRING22 ); // Make sure correct events were retrieved CHECKASSERTGOTOId(((dwEventsRetrieved & SPEI_TTS_BOOKMARK) == SPEI_TTS_BOOKMARK), tpr, IDS_STRING22); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLSilence(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLSilence_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLSilence_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test speaks 2 streams. One with a Silence pause and one without. It analyzes //the two streams to make sure a change has occured. This tests SILENCE tag. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; STATSTG Stat; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 1 with no SILENCE tag"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING23, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples1 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples1 > 0), tpr, IDS_STRING25, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 2 with SILENCE tag"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING24, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples2 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples2 > 0), tpr, IDS_STRING25, TEST_TOPIC ); // Now compare the length of the 2 streams // Note - check to ensure cSamples2 is at least twice greater than cSamples1. CHECKASSERTId((cSamples2 > 2 * cSamples1), tpr, IDS_STRING25); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLSpell(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLSpell_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLSpell_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test generates two streams. One that says English as a single word and one that // spells it out. It analyzes the produced .wav forms to make sure that the second streams // overall size is greater. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; STATSTG Stat; LANGID LangID; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); DOCHECKHRGOTO( hr = SpGetLanguageIdFromDefaultVoice(&LangID); ); //====================================================================== TEST_TOPIC = "Stream 1 with no Spell tag"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING26, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples1 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); //====================================================================== TEST_TOPIC = "Stream 2 with Spell tag"; //====================================================================== // Create stream #2 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING27, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples2 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); //For Chinese/Japanese TTS Engines, the test ignores result check since //Spell tag can be ignored in those languages if ( ( LangID != 2052 ) && ( LangID != 1041 )) { CHECKASSERTGOTOIdEx((cSamples2 != 0), tpr, IDS_STRING28, TEST_TOPIC ); CHECKASSERTGOTOIdEx((cSamples1 != 0), tpr, IDS_STRING28, TEST_TOPIC ); // Now compare the values from the 2 streams. // Note - check to ensure cSamples2 is at least 4/3 greater than cSamples1. CHECKASSERTId(((3 * cSamples2 )> (4 * cSamples1)), tpr, IDS_STRING28); } EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLPronounce(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLPronounce_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLPronounce_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test generates two streams. One that says "a" as a single word. The next stream // says "a" but tells the engine to pronounce it as a random long word. It analyzes the // produced .wav forms to make sure that the second stream's overall size is greater. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; STATSTG Stat; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 1 with no PRON tag"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); // short string hr = GetWStrFromRes( IDS_STRING56, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples1 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples1 != 0), tpr, IDS_STRING29, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 2 with PRON tag"; //====================================================================== // Create stream #2 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); // short string pronounced as a long string hr = GetWStrFromRes( IDS_STRING57, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples2 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples2 != 0), tpr, IDS_STRING29, TEST_TOPIC ); // Now compare the values from the 2 streams // Note - check to ensure cSamples2 is at least twice greater than cSamples1. CHECKASSERTId((cSamples2> (2 * cSamples1)), tpr, IDS_STRING29); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLRate(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLRate_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLRate_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test changes the rate of a TTS engine twice through XML and analyzes the // .wav form to make sure a change has occured. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; STATSTG Stat; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 1 with rate set to -5"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING30, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples1 = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples1 != 0), tpr, IDS_STRING32, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 2 with rate set to 5"; //====================================================================== // Create stream #2 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING31, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples2 = (ULONG)Stat.cbSize.QuadPart / sizeof(WCHAR); CHECKASSERTGOTOIdEx((cSamples2 != 0), tpr, IDS_STRING32, TEST_TOPIC ); // Now compare the values from the 2 streams // 1. First check ensures low rate has bigger cSamples than higher rate // 2. Secondly check ensures cSamples1 and cSamples2 has enough distance // CHECKASSERTId((cSamples1 > cSamples2 ), tpr, IDS_STRING32); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLVolume(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLVolume_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLVolume_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test changes the volume of a TTS engine twice through XML and analyzes the // .wav form to make sure a change has occured. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; ULONG cSamples=0; ULONG ulRatio=0; WCHAR szwSpeakStr[MAX_PATH]=L""; ULONG totalAmp1 = 0, totalAmp2 = 0; WCHAR szwDebug[MAX_PATH]=L""; const char * TEST_TOPIC = ""; CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOId( hr, tpr, IDS_STRING84 ); //====================================================================== TEST_TOPIC = "Stream 1 with Volume 100"; //====================================================================== //*** First stream with volume set to 100 // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING33, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); LARGE_INTEGER l; l.QuadPart = 0; // Reset stream to beginning hr = cpStream1->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING79, TEST_TOPIC); // get the sum of the amplitude from the stream 1 hr = GetAmpFromSamples (cpStream1, &totalAmp1 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING82, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream 2 with Volume 1"; //====================================================================== //*** Second stream with volume set to 1 // Create stream #2 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING60, TEST_TOPIC); hr = GetWStrFromRes( IDS_STRING34, szwSpeakStr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC); // Reset stream to beginning hr = cpStream2->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING79, TEST_TOPIC); // get the sum of the amplitude from the stream 1 hr = GetAmpFromSamples (cpStream2, &totalAmp2 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING82, TEST_TOPIC ); //Make sure the amplitudes of stream1 and stream2 are greater than 0 CHECKASSERTGOTOId( (totalAmp1 > 0), tpr, IDS_STRING35 ); CHECKASSERTGOTOId( (totalAmp2 > 0), tpr, IDS_STRING35 ); // Note - The test assumes that the overall amplitude from stream 1 will // be at least 3 times that of stream 2 ulRatio = totalAmp1/totalAmp2; CHECKASSERTId( (ulRatio>1), tpr, IDS_STRING35 ); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLPitch(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLPitch_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLPitch_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test changes the pitch of a TTS engine twice through XML and analyzes the // .wav form to make sure a change has occured. It first speaks a sentence at // normal pitch and finds the average of the positive amplitude. The average positive // amplitude is then used as a threshhold above which peak detection is measured. It // is expected that a higher pitch wav form will have more peaks above the threshhold // then a lower pitch wav form will. // NOTE - wav samples are run through a low frequency filter to generate a smother // wav form. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } CComPtr cpStream1; CComPtr cpStream2; STATSTG Stat; ULONG cSamples = 0; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwDebug[MAX_PATH]=L""; ULONG freq1=0, freq2=0; float fratio = 0; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); //sampFreq = 22050; CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); hr = cpVoice->SetVolume( 100 ); CHECKHRIdEx( hr, tpr, IDS_STRING18, TEST_TOPIC); hr = cpVoice->SetRate( 0 ); CHECKHRIdEx( hr, tpr, IDS_STRING16, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Stream # 1 with low pitch"; //====================================================================== // Create stream #1 with low pitch hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC ); // Set the default output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC ); hr = GetWStrFromRes( IDS_STRING37, szwSpeakStr ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING83, TEST_TOPIC ); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC ); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples = (ULONG)Stat.cbSize.QuadPart / sizeof(short); CHECKASSERTGOTOIdEx((cSamples != 0), tpr, IDS_STRING39, TEST_TOPIC ); LARGE_INTEGER l; l.QuadPart = 0; // Reset stream to beginning hr = cpStream1->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); hr = GetFreqFromSamples (cpStream1, 22050, cSamples, &freq1); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING91, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream # 2 with high pitch"; //====================================================================== // Create stream #2 with high pitch hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC ); // Set the default output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC ); hr = GetWStrFromRes( IDS_STRING38, szwSpeakStr ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING83, TEST_TOPIC ); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC ); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING90, TEST_TOPIC ); cSamples = (ULONG)Stat.cbSize.QuadPart / sizeof(SHORT); CHECKASSERTGOTOIdEx((cSamples != 0), tpr, IDS_STRING39, TEST_TOPIC ); // Reset stream to beginning hr = cpStream2->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); hr = GetFreqFromSamples (cpStream2, 22050, cSamples, &freq2); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING91, TEST_TOPIC ); { //debug TCHAR szDInfo[MAX_PATH]=TEXT(""); _stprintf( szDInfo, TEXT("freq1 = %d, freq2 = %d"), freq1, freq2 ); g_pKato->Comment(10, szDInfo); } // Now compare the frequencies of the audio output streams // Note - Average freqencey with high pitch has at least 1.2 times higher than // low pitch CHECKASSERTId((freq1 > 0), tpr, IDS_STRING39 ); CHECKASSERTId((freq2 > 0), tpr, IDS_STRING39 ); fratio = (float)freq2/(float)freq1; CHECKASSERTId((fratio > 1.2 ), tpr, IDS_STRING39 ); EXIT: return tpr; } //*************************************************************************************** TESTPROCAPI t_XMLNonSapiTagsTest(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with an arbitrary non-sapi tag. In this case, SAPI supplys the //SPVA_ParseUnknownTag text fragment state to the tts engine. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpVoice; CComPtr cpStream; WCHAR szwSpeakStr[MAX_PATH]=L""; CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOId(hr, tpr, IDS_STRING84); //create a SAPI voice hr = cpVoice.CoCreateInstance( CLSID_SpVoice ); CHECKHRGOTOId( hr, tpr, IDS_STRING85 ); hr = GetWStrFromRes( IDS_STRING67, szwSpeakStr ); CHECKHRGOTOId(hr, tpr, IDS_STRING83); // Create a generic stream to send the audio data to so we don't have to listen to it hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream ); CHECKHRGOTOId(hr, tpr, IDS_STRING81 ); // Set the default output format hr = cpVoice->SetOutput( cpStream, TRUE); CHECKHRGOTOId(hr, tpr, IDS_STRING60 ); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRId(hr, tpr, IDS_STRING13); EXIT: return tpr; } //********************************************************************************* TESTPROCAPI t_XMLEmphTest(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with EMPH tag. Test uses Pitch, Rate and volume to measure //the output streams. The test assume that the output stream of EMPH is different //in Rate, or Volume, or pitch from one without emph. If engines implement EMPH in //other different way, rather than use pitch, rate, or volume, then this test will //fail. And the test result will be "Not Supported". // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_SUPPORTED; CComPtr cpVoice; CComPtr cpStream1; CComPtr cpStream2; ULONG ulRatio=0; STATSTG Stat; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStr[MAX_PATH]=L""; ULONG totalAmp1 = 0, totalAmp2 = 0; ULONG freq1=0, freq2=0; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); hr = GetWStrFromRes( IDS_STRING69, szwSpeakStr ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING83, TEST_TOPIC ); // Create the SAPI voice hr = cpVoice.CoCreateInstance( CLSID_SpVoice ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING85, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream #1 without Emph"; //====================================================================== // Create stream #1 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream1 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC ); // Set the output format hr = cpVoice->SetOutput( cpStream1, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC ); //no Emph hr = GetWStrFromRes( IDS_STRING68, szwSpeakStr ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING83, TEST_TOPIC ); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC ); // Get stream size hr = cpStream1->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING90, TEST_TOPIC); cSamples1 = (ULONG)Stat.cbSize.QuadPart / sizeof(SHORT); LARGE_INTEGER l; l.QuadPart = 0; // Reset stream to beginning hr = cpStream1->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); // get the sum of the amplitude from the stream 1 hr = GetAmpFromSamples (cpStream1, &totalAmp1 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING82, TEST_TOPIC ); // Reset stream to beginning again hr = cpStream1->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); //get frequency hr = GetFreqFromSamples (cpStream1, 22050, cSamples1, &freq1); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING91, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Stream #2 with Emph"; //====================================================================== // Create stream #2 hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream2 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC ); // Set the output format hr = cpVoice->SetOutput( cpStream2, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC ); GetWStrFromRes( IDS_STRING69, szwSpeakStr ); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC ); // Get stream size hr = cpStream2->Stat( &Stat, STATFLAG_NONAME ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING90, TEST_TOPIC); cSamples2 = (ULONG)Stat.cbSize.QuadPart / sizeof(SHORT); // Reset stream to beginning hr = cpStream2->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); // get the sum of the amplitude from the stream 2 hr = GetAmpFromSamples (cpStream2, &totalAmp2 ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING82 , TEST_TOPIC ); // Reset stream to beginning again hr = cpStream2->Seek( l, SEEK_SET, NULL ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING79, TEST_TOPIC ); hr = GetFreqFromSamples (cpStream2, 22050, cSamples2, &freq2); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING91, TEST_TOPIC ); //Compare the two streams by Pitch, volume, and Rate. //The output streams should be different in pitch, or volume, or Rate. //Rate measurement CHECKISSUPPORTEDId( (cSamples2 > 0), tpr, IDS_STRING70 ); CHECKISSUPPORTEDId( (cSamples1 > 0), tpr, IDS_STRING70 ); //Volume measurement CHECKISSUPPORTEDId( (totalAmp1 > 0), tpr, IDS_STRING70 ); CHECKISSUPPORTEDId( (totalAmp2 > 0), tpr, IDS_STRING70 ); // Pitch measurement CHECKISSUPPORTEDId( (freq2 > 0), tpr, IDS_STRING70 ); CHECKISSUPPORTEDId( (freq1 > 0), tpr, IDS_STRING70 ); CHECKISSUPPORTEDId( (freq2 != freq1 ) || (cSamples2 != cSamples1 ) || (totalAmp2 != totalAmp1) , tpr, IDS_STRING70 ); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLContext(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpLocalVoice; // Create the SAPI voice DOCHECKHRGOTO (hr = cpLocalVoice.CoCreateInstance( CLSID_SpVoice );); tpr = t_XMLContext_Test(uMsg, tpParam, lpFTE, cpLocalVoice, false); EXIT: return tpr; } //******************************************************************************** TESTPROCAPI t_XMLContext_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { //This test Speaks with CONTEXT tag. // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_PASS; CComPtr cpStream; const char * TEST_TOPIC = ""; WCHAR szwSpeakStr[1024]=L""; //====================================================================== TEST_TOPIC = "Context: Initialization"; //====================================================================== CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING84, TEST_TOPIC ); // Create stream hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC ); // Set the output format hr = cpVoice->SetOutput( cpStream, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#1a - date_mdy"; //====================================================================== //Date in mdy format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING99, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#1b - date_dmy"; //====================================================================== //Date in date_dmy format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING100, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#1c - date_ymd"; //====================================================================== //Date in date_ymd format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING101, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#2a - date_ym"; //====================================================================== //Date in date_ym format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING102, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#2b - date_my"; //====================================================================== //Date in date_my format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING103, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#2c - date_dm"; //====================================================================== //Date in date_dm format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING104, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#2d - date_md"; //====================================================================== //Date in date_md format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING105, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#2e - date_md"; //====================================================================== //Date in date_year format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING106, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#3 - time"; //====================================================================== //Time in time_hms format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING107, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#4a - number_cardinal"; //====================================================================== //Number in number_cardinal format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING108, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#4b - number_digit"; //====================================================================== //Number in number_digit format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING109, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#4c - number_fraction"; //====================================================================== //Number in number_fraction format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING110, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#4d - number_decimal"; //====================================================================== //Number in number_decimal format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING111, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#5 - phone_number"; //====================================================================== // phone_number format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING112, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#6 - currency"; //====================================================================== // currency format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING113, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#7 - web"; //====================================================================== // web format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING114, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#8 - email_address"; //====================================================================== // email address format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING115, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#9 - address"; //====================================================================== // address format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING116, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#10 - address_postal"; //====================================================================== // address postal format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING117, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Context: Test#11 - my context tests"; //====================================================================== // // ms context format DOCHECKHRGOTO( hr = GetWStrFromRes( IDS_STRING118, szwSpeakStr );); hr = cpVoice->Speak( szwSpeakStr, SPF_IS_XML, NULL ); CHECKHRIdEx( hr, tpr, IDS_STRING13, TEST_TOPIC ); EXIT: return tpr; } //************************************************************************************* TESTPROCAPI t_XMLPartOfSpTest(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE) { //This test is trying to Speak with PartOfSP tags. //Currently it is in the feature list. The test result will be "Supported" // or "Unsupported". // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } HRESULT hr = S_OK; int tpr = TPR_SUPPORTED; CComPtr cpVoice; CComPtr cpConlexicon; LANGID LangID; ULONG cSamples1=0, cSamples2=0; WCHAR szwSpeakStrNoun[MAX_PATH]=L""; WCHAR szwSpeakStrVerb[MAX_PATH]=L""; WCHAR szNewWord[MAX_PATH]=L""; WCHAR szwSpeakstr[MAX_PATH]=L""; WCHAR szVPronunciation[MAX_PATH]=L""; WCHAR szNPronunciation[MAX_PATH]=L""; const char * TEST_TOPIC = ""; //====================================================================== TEST_TOPIC = "Initialization"; //====================================================================== hr = GetWStrFromRes( IDS_STRING76, szNewWord ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); DOCHECKHRGOTO( hr = SpGetLanguageIdFromDefaultVoice(&LangID); ); //create a SAPI voice hr = cpVoice.CoCreateInstance( CLSID_SpVoice ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING85, TEST_TOPIC ); hr = cpConlexicon.CoCreateInstance(CLSID_SpLexicon); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING85, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Add verb pronunciation to a word"; //====================================================================== hr = GetWStrFromRes( IDS_STRING48, szwSpeakStrVerb ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); //get phoneid hr = TTSSymToPhoneId ( LangID, szwSpeakStrVerb, szVPronunciation); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING77, TEST_TOPIC ); hr = cpConlexicon->RemovePronunciation(szNewWord, LangID, SPPS_Verb, szVPronunciation); CHECKHRALTGOTOIdEx( hr, SPERR_NOT_IN_LEX, tpr, IDS_STRING89, TEST_TOPIC); //Assign the verb pronunciation of the new word hr = cpConlexicon->AddPronunciation(szNewWord, LangID, SPPS_Verb, szVPronunciation); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING87, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Add noun pronunciation to a word"; //====================================================================== hr = GetWStrFromRes( IDS_STRING52, szwSpeakStrNoun ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); //get phoneid hr = TTSSymToPhoneId ( LangID, szwSpeakStrNoun, szNPronunciation); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING77, TEST_TOPIC ); hr = cpConlexicon->RemovePronunciation(szNewWord, LangID, SPPS_Noun, szNPronunciation); CHECKHRALTGOTOIdEx( hr, SPERR_NOT_IN_LEX, tpr, IDS_STRING89, TEST_TOPIC); //add the word in noun pronunciation to Lexicon hr = cpConlexicon->AddPronunciation(szNewWord, LangID, SPPS_Noun, szNPronunciation); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING87, TEST_TOPIC ); //====================================================================== TEST_TOPIC = "Speak two streams with PartOfSp"; //====================================================================== //speak two streams hr = GetWStrFromRes( IDS_STRING49, szwSpeakstr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); swprintf( szwSpeakStrNoun, szwSpeakstr, szNewWord ); hr = GetWStrFromRes( IDS_STRING50, szwSpeakstr ); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING83, TEST_TOPIC); swprintf( szwSpeakStrVerb, szwSpeakstr, szNewWord ); hr = t_SpeakTwoStreams(cpVoice, szwSpeakStrNoun, szwSpeakStrVerb, cSamples1, cSamples2); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING88, TEST_TOPIC); hr = cpConlexicon->RemovePronunciation(szNewWord, LangID, SPPS_Noun, szNPronunciation); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING89, TEST_TOPIC); hr = cpConlexicon->RemovePronunciation(szNewWord, LangID, SPPS_Verb, szVPronunciation); CHECKHRGOTOIdEx( hr, tpr, IDS_STRING89, TEST_TOPIC); CHECKISSUPPORTEDId((cSamples1 > 0 ), tpr, IDS_STRING51); CHECKISSUPPORTEDId((cSamples2 > 0 ), tpr, IDS_STRING51); //This test assumes that second stream should be twice shorter than the first one. CHECKISSUPPORTEDId( ( 2* cSamples2 < cSamples1), tpr, IDS_STRING51); EXIT: return tpr; } //************************************************************************************** TESTPROCAPI t_XMLSAPIMarkup_Test(UINT uMsg, TPPARAM tpParam, LPFUNCTION_TABLE_ENTRY lpFTE, ISpVoice *cpVoice, bool bCalledByMulti) { // This test expects TTS engines to handle all possible spec'ed out combinations //of the XML tags. HRESULT hr = S_OK; int tpr = TPR_PASS; // Message check if (uMsg != TPM_EXECUTE) { return TPR_NOT_HANDLED; } else if(lpFTE) // called by SpComp directly. It is NULL in multiInstance test. { srand(reinterpret_cast(tpParam)->dwRandomSeed); } CComPtr cpStream; WCHAR szwSpeakStr[MAX_PATH]=L""; WCHAR szwXMLString[MAX_PATH]=L""; const char * TEST_TOPIC = ""; CSpStreamFormat NewFmt(SPSF_22kHz16BitMono, &hr); CHECKHRGOTOId(hr, tpr, IDS_STRING84); //====================================================================== TEST_TOPIC = "Markup Test: Initialization"; //====================================================================== // Create a generic stream to send the audio data to so we don't have to listen to it hr = SPCreateStreamOnHGlobal( NULL, true, NewFmt.FormatId(), NewFmt.WaveFormatExPtr(), &cpStream ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING81, TEST_TOPIC); // Set the default output format hr = cpVoice->SetOutput( cpStream, TRUE); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING60, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Bookmark"; //====================================================================== // Bookmark DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING8, szwXMLString );); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Silence"; //====================================================================== // Silence DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING41, szwSpeakStr );); swprintf( szwXMLString, szwSpeakStr, GET_RANDOM(0, 2000) ); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Spell"; //====================================================================== // Spell DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING27, szwXMLString );); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Pron"; //====================================================================== // Pronounce DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING43, szwXMLString );); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Rate"; //====================================================================== // Rate DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING44, szwSpeakStr );); swprintf( szwXMLString, szwSpeakStr, GET_RANDOM(-10, 10) ); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Volume"; //====================================================================== // Volume DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING45, szwSpeakStr );); swprintf( szwXMLString, szwSpeakStr, GET_RANDOM(0, 100) ); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Pitch"; //====================================================================== // Pitch DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING46, szwSpeakStr );); swprintf( szwXMLString, szwSpeakStr, GET_RANDOM(-10, 10) ); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Non-Sapi"; //====================================================================== //Non-Sapi DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING67, szwXMLString );); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); //====================================================================== TEST_TOPIC = "Markup Test: Context"; //====================================================================== //Context DOCHECKHRGOTO (hr = GetWStrFromRes( IDS_STRING119, szwXMLString );); hr = cpVoice->Speak( szwXMLString, SPF_ASYNC | SPF_IS_XML, NULL ); CHECKHRIdEx(hr, tpr, IDS_STRING13, TEST_TOPIC); hr = cpVoice->WaitUntilDone( TTS_WAITTIME ); CHECKHRGOTOIdEx(hr, tpr, IDS_STRING61, " in t_XMLBookmarkTest"); EXIT: return tpr; }