2011-08-26 2 views
0

나는 SAPI 5.1 "텍스트 음성 변환 자습서"의 지침에 따라 튜토리얼에 제공된 샘플 코드를 컴파일했습니다 (지침 및 샘플 코드는 SAPI 5.3 TTS Tutorial! 및 SAPI 5.4 TTS Tutorial!로 지정됨). 컴파일 된 프로그램은 빌드 된 XP PC에서 제대로 작동하지만 다른 XP 및 Win 7 PC에서는 작동하지 않습니다. 다른 2 대의 PC에는 음성 SDK가 설치되어 있지 않습니다. 그러나 SAPI 5.1 데모 프로그램 TTSApp 및 MS Excel 2003 텍스트 음성 변환 기능은이 2 대의 PC에서 매우 잘 작동합니다.TTS C++ 프로그램은 PC를 개발할 때만 실행할 수 있습니다

자습서 프로그램이 개발 PC에서만 실행되고 다른 2 가지 프로그램이 모든 PC에서 실행될 수있는 이유는 무엇입니까?

개발 PC에는 XP sp3, Visual Studio 2008 및 SAPI 5.1이 설치되어 있습니다. 프로젝트를 빌드 할 때 미리 컴파일 된 헤더를 선택했습니다. 아래의 1 단계에서 stdafx.h 파일에 "#endif"가 없으므로 "#include"다음에이 줄이 삽입됩니다.

XP PC의 오류 메시지 : 응용 프로그램 구성이 잘못되어이 응용 프로그램을 시작하지 못했습니다. 응용 프로그램을 다시 설치하면이 문제가 해결 될 수 있습니다.

Win7 PC의 오류 메시지 : side-by-side 구성이 잘못되어 응용 프로그램을 시작하지 못했습니다. 자세한 내용은 응용 프로그램 이벤트 로그를 참조하거나 명령 줄 sxstrace.exe 도구를 사용하십시오.

다음은 자습서입니다.

Microsoft 음성 SDK SAPI이 튜토리얼은 매우 기본적인 텍스트 음성 변환 (TTS) 예를 커버 텍스트 음성 자습서 5.1


. 콘솔 응용 프로그램은 가장 간단한 음성 데모 중 하나입니다. TTS에 해당하는 것은 "Hello World"입니다. 그래픽 인터페이스 (및 이벤트 펌프)를 사용하는 Windows 응용 프로그램에 해당하는 샘플은 TTS와 이벤트 사용에서 사용할 수 있습니다. 샘플은 가장 단순한 (비 기능적이지만) COM 프레임 워크에서 문장을 말하기까지 구축됩니다. 각 새 기능에 대한 단계가 제공됩니다. 이 샘플은 심지어 XML 태그를 사용하여 음성을 수정하는 것을 보여주는 것 이상의 한 걸음 나아 간다. 전체 샘플 신청서는 페이지 하단에 있습니다.

1 단계 : 프로젝트 설정 2 단계 : COM 초기화 3 단계 : 음성 설정 4 단계 : 말하십시오! 5 단계 : 음성 수정

1 단계 : 프로젝트 설정 처음부터 응용 프로그램을 작성할 수는 있지만 기존 프로젝트에서 시작하는 것이 더 쉽습니다. 이 경우 Visual Studio 응용 프로그램 마법사를 사용하여 Win32 콘솔 응용 프로그램을 만듭니다. 마법사를 설정하는 동안 묻는 메시지가 표시되면 샘플로 "Hello, world"를 선택하십시오. 생성 후 STDAfx.h 파일을 열고 "#include"다음 "#endif"문 앞에 다음 코드를 붙여 넣습니다. 이것은 SAPI가 요구하는 추가 종속성을 설정합니다.

#define _ATL_APARTMENT_THREADED 

#include <atlbase.h> 
//You may derive a class from CComModule and use it if you want to override something, 
//but do not change the name of _Module 
extern CComModule _Module; 
#include <atlcom.h> 

코드 목록 1 다음 SAPI.h 및 SAPI.lib 파일의 경로를 추가합니다. 표시된 경로는 표준 SAPI SDK 설치를위한 것입니다. 컴파일러에서 파일을 찾을 수 없거나 비표준 설치가 수행 된 경우 파일에 대한 새 경로를 사용하십시오. 경로를 반영하도록 프로젝트 설정을 변경하십시오. 프로젝트 -> 설정 사용하기. 메뉴 항목에서 SAPI.h 경로를 설정하십시오. C/C++ 탭을 클릭하고 Category 드롭 다운 목록에서 Preprocessor를 선택하십시오. "추가 포함 디렉터리"에 다음을 입력합니다. C : \ Program Files \ Microsoft Speech SDK 5.1 \ Include. SAPI.lib 경로를 설정하려면 다음을 수행하십시오. 1.동일한 설정 대화 상자에서 링크 탭을 선택하십시오. 2. 범주 드롭 다운 목록에서 입력을 선택하십시오. 3. "추가 라이브러리 경로"에 다음 경로를 추가하십시오. C : \ Program Files \ Microsoft Speech SDK 5.1 \ Lib \ i386. 4. "Object/library modules"줄에도 "sapi.lib"를 추가하십시오. 이름이 공백으로 구분되어 있는지 확인하십시오.

2 단계 : COM 초기화 SAPI는 COM 기반 응용 프로그램이며 사용 전과 SAPI가 활성화되는 동안 모두 COM을 초기화해야합니다. 대부분의 경우 이는 호스트 응용 프로그램의 수명 동안입니다. 다음 코드 (Listing 2)는 COM을 초기화한다. 물론 응용 프로그램은 초기화 이외의 작업을 수행하지 않지만 COM이 성공적으로 시작되었는지 확인합니다.

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

int main(int argc, char* argv[]) 
{ 
    if (FAILED(::CoInitialize(NULL))) 
     return FALSE; 

    ::CoUninitialize(); 
    return TRUE; 
} 

코드 목록이 3 단계 : COM 일단 가 실행되는 설정 목소리가, 다음 단계는 음성을 만드는 것입니다. 음성은 단순히 COM 개체입니다. 또한 SAPI는 지능형 기본값을 사용합니다. 오브젝트 초기화 중에 SAPI는 대부분의 값을 자동으로 지정하여 오브젝트가 즉시 사용되도록합니다. 이는 이전 버전의 중요한 개선 사항입니다. 기본값은 제어판의 음성 속성에서 검색되며 음성 (시스템에서 둘 이상을 사용할 수있는 경우) 및 언어 (영어, 일본어 등)와 같은 정보가 포함됩니다. 일부 기본값은 분명하지만 다른 것은 (말하기 속도, 피치 등) 아닙니다. 그럼에도 불구하고 모든 기본값은 프로그래밍 방식으로 또는 제어판의 음성 속성에서 변경 될 수 있습니다. pVoice 포인터를 NULL로 설정하는 것은 필요하지 않지만 오류 검사에 유용합니다. 이 잘못된 포인터가 재사용되지 보장, 또는 알림으로 포인터가 이미 할당 또는 3 굵게 텍스트는이 예를 들어 새로운 코드를 나타냅니다

#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)) 
    { 
     pVoice->Release(); 
     pVoice = NULL; 
    } 

    ::CoUninitialize(); 
    return TRUE; 
} 

코드 목록 해제되었습니다. 4 단계 : 말하기! 실제 문구의 사용은 똑같이 간단한 작업입니다. 한 행에서 Speak 기능을 호출합니다. 음성 인스턴스가 더 이상 필요하지 않으면 개체를 해제 할 수 있습니다.

#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; 
} 

코드 목록 4. 굵게 표시된 텍스트는이 예의 새 코드를 나타냅니다. 5 단계 : 음성 수정 음성은 다양한 방법을 사용하여 수정할 수 있습니다. 가장 직접적인 방법은 XML 명령을 스트림에 직접 적용하는 것입니다. 명령은 XML 스키마에 설명되어 있습니다. 이 경우 상대 등급 10은 음성의 피치를 낮 춥니 다.

#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); 

     // Change pitch 
     hr = pVoice->Speak(L"This sounds normal <pitch middle = '-10'/> but the pitch drops half way through", SPF_IS_XML, NULL); 
     pVoice->Release(); 
     pVoice = NULL; 
    } 
    ::CoUninitialize(); 
    return TRUE; 
} 

코드 목록 5. 굵게 표시된 텍스트는이 예의 새 코드를 나타냅니다. 이것이 전체 코드 샘플입니다.

답변

3

설치 프로그램과 함께 제공되는 C++ 런타임 (redist)을 설치해야합니다. 설치 한

VC++ 2008 SP1 redist

VC++ 2008 redist

은 VS 서비스 팩에 따라 달라집니다 - 아니라면하지 SP1 다음 SP1합니다.

EDIT : 두 번째 방법은 런타임 라이브러리를 정적으로 연결하는 것입니다. 이렇게하면 실행 파일의 크기가 늘어나지 만 대상 컴퓨터에 대한 추가 요구 사항은 필요하지 않습니다.

관련 문제