2013-03-22 1 views
1

Microsoft SAPI5 음성 엔진을 사용하는 응용 프로그램을 개발 중입니다. 그러나 나는 벽에 부딪쳤다. 나는 TTS 엔진이 그것을 반복 할 수 있도록 사용자로부터의 입력을 저장하는 변수의 데이터를 사용하려고 노력해 왔습니다. 그러나 sapi5 스피치 함수는 문자열, wstrings 또는 LPCWSTR을 제외한 다른 유형을 허용하지 않습니다. 내 연구에서 와이드 문자열에 대한 포인터이므로 wstrings을 허용해서는 안됩니까?sapi5에서 사용자 입력 데이터를 저장하는 변수를 저장합니다.

다음은 MSDN에서 몇 가지 예제 코드입니다 :

... 
wstring text; 
if(SUCCEEDED(hr)) 
    { 
     wcin >> text; 
     hr = pVoice->Speak(text, SPF_IS_XML, NULL); 
     pVoice->Release(); 
     pVoice = NULL; 
    } 
... 

그러나이 작동하지 않습니다

#include <stdafx.h> 
#include <sapi.h> 

int main(int argc, char* argv[]) 
{ 
    ISpVoice * pVoice = NULL; 

    if (FAILED(::CoInitialize(NULL))) 
     return FALSE; 

    HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice;); 
    if(SUCCEEDED(hr)) 
    { 
     hr = pVoice->Speak(L"Hello world", 0, NULL); 
     pVoice->Release(); 
     pVoice = NULL; 
    } 

    ::CoUninitialize(); 
    return TRUE; 
} 

그래서 예를 들어 내가이 코드 조각이 있다고 할 수 있습니다. LPCWSTR 타입을 허용하는 변수를 저장하는 방법은 무엇입니까? 저는 C++을 처음 접했을 때 처음으로 이런 종류의 문제가 생겨서 매우 새로운 것입니다. 고체 연구의 https://stackoverflow.com/questions/12292790/how-do-i-use-variables-in-sapi-tts

답변

0

약 2 시간 후, 나는 형식을 LPCWSTR하는 문자열 변환에 MSDN에 관한 기사를 발견 :

나는이 주제에 대한 영업 이익은 동일한 문제가 있음을 보았다. 코드는 다음과 같습니다 :

std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

내가 다음 내 프로젝트에이 코드를 포함하고 TTS 엔진 초기화 함수에 대한 LPCWSTR 반복 (변환 된 문자열은 TTS 기능에 사용할 수 있도록라는 함수 매개 변수를 생성, 엔진은 변환 된 문자열의 내용을 말합니다).

static int TTS_Speak_Dialogue(LPCWSTR Repeat) 
     { 
      // Set Sapi5 voice properties 
      ISpVoice * pVoice = NULL; 

      if (FAILED(::CoInitialize(NULL))) 
      return FALSE; 

      // Create new instance of Sapi5 once initialized in COM 
      HRESULT hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice); 

       if(SUCCEEDED(hr)) 
       { 
        hr = pVoice->Speak(Repeat, SPF_IS_XML, NULL); 
        pVoice->Release(); 
        pVoice = NULL; 
       } 

      ::CoUninitialize(); 
      return TRUE; 
     } 

그런 다음 변환을 관리하고 사용자 입력을 관리하여 TTS 엔진이이를 반복 할 수있는 또 다른 기능을 만들었습니다.

static void convert_string() 
{ 
    // Declare a string type variable 
    string UserInput; 
    // Now get input from user 
    cout << "Get the TTS to repeat Input : "; 
    cin >> UserInput; 

    // Convert string to LPCWSTR! 
    std::wstring stemp = s2ws(UserInput); 
    // UserInput string now converted to result 
    LPCWSTR result = stemp.c_str(); 

    // Call the TTS engine function and use the converted string 
    TTS_Speak_Dialogue(result); 
} 

내 대답이 내가 갖고있는 것과 같은 문제를 가진 사람들에게 도움이되기를 바랍니다.

좀 더 자세하게 설명 하겠지만 잠을 좀 자고 싶습니다. 그래서 진심으로 사과드립니다 .--).

관련 문제