轉摘請說明出處:http://www.cnblogs.com/luochengor/p/3511165.html以及作者,謝謝。
eSpeak是最為流行的開源跨平台的文本轉語音程序。這兩天進行了簡單的研究。
先去網站看看吧! http://espeak.sourceforge.net/,網站很簡潔,了解大概后下載需要的東西。這里下載兩個包,分別是:
espeak-1.47.11-win.zip
espeak-1.47.11-source.zip
前者是一個完整的安裝包,可以進行演示用,后者猜是開發要用的包。
通過閱讀文檔發現需要另一個開源軟件的支持,PortAudio庫:免費開源的跨平台音頻播放庫,支持Windows, Macintosh, Unix, SGI and BeOS等平台,以下工程都是在Microsoft Visual Studio 2008下完成編譯。
一、 准備
1、PortAudio開源庫 :本人用的是 pa_stable_v19_20111121.tgz
官方主頁:http://www.portaudio.com/
2、依賴ASIO庫:用於異步處理
3、依賴DirectX庫:用於驅動聲卡
二、步驟
1、將ASIO庫 拷貝到 portaudio\src\hostapi\asio\目錄下,即整個ASIOSDK文件夾放到portaudio\src\hostapi\asio\目錄下。
2、安裝DirectX庫。
3、 用VS2008打開portaudio\build\msvc\portaudio.dsw (打開portaudio.sln)
4、可選:
官方說明:http://www.portaudio.com/trac/wiki/TutorialDir/Compile/Windows(參照設置)
http://www.portaudio.com/trac/wiki/TutorialDir/Compile/WindowsASIOMSVC(參照檢查文件)
注:Finally, open the "pa_win_hostapis.c" file. Add the following:
#define PA_NO_WMME
#define PA_NO_DS
在Win32環境中是需要WMME和DS的。這兩個define語句是需要加的。
DirectX庫的安裝目錄默認為:C:\Program Files\Microsoft DirectX SDK (June 2010)
需要在工程內分別添加對DirectX SDK的頭文件和lib的引用,即:
C:\Program Files\Microsoft DirectX SDK (June 2010)\include
lib根據自己需要有32位的和64位的,本人用的是32位的
C:\Program Files\Microsoft DirectX SDK (June 2010)\lib\X86
不然會提示,找不到dsound.h這個文件的錯誤。
編譯生成的動態鏈接庫portaudio_x86.dll、portaudio_x86.lib和portaudio.h是我們在eSpeak中可能要用到的。
解壓espeak-1.47.11-source.zip,espeak-1.47.11-source\platforms\windows\目錄下包含了windows_cmd、windows_dll、windows_sapi和espeakedit工程目錄,里邊都含有VC工程項目文件。
windows_cmd是生成espeak.exe命令行程序。
windows_dll是生成espeak_lib.dll動態鏈接庫(本人主要想使用這個,通過函數調用實現文本轉語音功能)。
windows_sapi是通過SAPI實現的動態鏈接庫(需要Microsoft Speech SDK的支持)。
espeakedit生成espeakedit.exe
先從windows_cmd開始,閱讀目錄下的!ReadMe.txt,espeak-1.47.11-source\src下的文件全部拷貝到,espeak-1.47.11-source\platforms\windows\windows_cmd\src,不包括speech.h、stdint.h,將上面生成的portaudio_x86.dll、portaudio_x86.lib和portaudio.h,加入到工程內,如果沒有意外的話這樣編譯就通過了,將生成的EXE和portaudio_x86.dll,拷貝到一個單獨的文件夾下如C:\espeak-1. 47.11-source,現在可以在cmd模式下運行命令測試了:
C:\Documents and Settings\Administrator>cd C:\espeak-1. 47.11-source
C:\espeak-1.40.02-source> espeak --path="." -v en "hello"
Can't read data file: '\espeak-data\phontab'
Failed to load espeak-data
不要慌,看下提示說找不到文件,將espeak-1.47.11-source目錄下的dictsource和espeak-data這兩個文件夾復制到C:\espeak-1. 47.11-source目錄下即可。
編譯windows_dll工程,這是文章的重點,因為我們要使用它編譯出來的動態鏈接庫來進行編程開發。同樣將espeak-1.47.11-source\src下的文件拷貝到espeak-1.47.11-source\platforms\windows\windows_dll\src下不覆蓋speak_lib.h、speech.h、StdAfx.h、stdint.h文件。將上面生成的portaudio_x86.dll、portaudio_x86.lib和portaudio.h,加入到工程內(需要在附加依賴項中添加portaudio_x86.lib),進行編譯,編譯通過,生成了espeak_lib.dll、espeak_lib.lib,這樣就可以寫一個測試程序看看勞動成果。
通過閱讀windows_dll工程目錄下的!ReadMe.txt知道Windows下面eSpeak只支持AUDIO_OUTPUT_SYNCHRONOUS模式,使用 AUDIO_OUTPUT_SYNCHRONOUS模式要設置回調函數。新建一個空的控制台工程,當然了也需要將speak_lib.h、espeak_lib.dll、espeak_lib.lib加入到工程內,代碼如下:
#include <iostream> #include <string> #include "speak_lib.h" using namespace std; #pragma comment(lib,"espeak_lib.lib") static int synthCallback(short *wav, int numsamples, espeak_EVENT *events) { // 可以根據源碼程序編寫這部分代碼實現生成語音文件功能。 return 0; } int main() { char text[] = "hello"; //包含espeak_data的目錄 string path = "E:\\workspace\\Microsoft Visual Studio 2008\\09.EspeakDemo\\Debug"; espeak_Initialize(AUDIO_OUTPUT_SYNCH_PLAYBACK, 0, path.c_str(), 0); // 設置回調函數 espeak_SetSynthCallback(synthCallback); // 設置中文 espeak_SetVoiceByName("zh+f2"); // 發音 espeak_Synth(text, 0, 0, POS_CHARACTER, 0, espeakCHARS_UTF8, NULL, NULL); // 等待發音結束 espeak_Synchronize(); espeak_Terminate(); return 0; }
運行測試吧,這回你一定有驚喜。說的是英文!想要說中文的話還用進行一些修改
char text[] = "hello"
改成
wchar_t text[] = L"你好";
espeak_Synth(text, 0, 0, POS_CHARACTER, 0, espeakCHARS_UTF8, NULL, NULL);
改成
espeak_Synth(text, 0, 0, POS_CHARACTER, 0, espeakCHARS_WCHAR, NULL, NULL);
雖然聲音難聽一點,但是也算可以。
參考文章:
1、http://cool.worm.blog.163.com/blog/static/6433900620097535713944/
2、http://wenku.baidu.com/view/52edd773f46527d3240ce00d.html?qq-pf-to=pcqq.c2c
轉摘請說明出處:http://www.cnblogs.com/luochengor/p/3511165.html以及作者,謝謝。
