轉摘請說明出處:http://www.cnblogs.com/luochengor/p/3511165.html以及做者,謝謝。html
eSpeak是最爲流行的開源跨平臺的文本轉語音程序。這兩天進行了簡單的研究。ios
先去網站看看吧! http://espeak.sourceforge.net/,網站很簡潔,瞭解大概後下載須要的東西。這裏下載兩個包,分別是:編程
espeak-1.47.11-win.zipwindows
espeak-1.47.11-source.zipapi
前者是一個完整的安裝包,能夠進行演示用,後者猜是開發要用的包。 異步
經過閱讀文檔發現須要另外一個開源軟件的支持,PortAudio庫:免費開源的跨平臺音頻播放庫,支持Windows, Macintosh, Unix, SGI and BeOS等平臺,如下工程都是在Microsoft Visual Studio 2008下完成編譯。 函數
1、 準備測試
一、PortAudio開源庫 :本人用的是 pa_stable_v19_20111121.tgz網站
官方主頁:http://www.portaudio.com/ui
二、依賴ASIO庫:用於異步處理
三、依賴DirectX庫:用於驅動聲卡
2、步驟
一、將ASIO庫 拷貝到 portaudio\src\hostapi\asio\目錄下,即整個ASIOSDK文件夾放到portaudio\src\hostapi\asio\目錄下。
二、安裝DirectX庫。
三、 用VS2008打開portaudio\build\msvc\portaudio.dsw (打開portaudio.sln)
四、可選:
官方說明: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);
雖然聲音難聽一點,可是也算能夠。
參考文章:
一、http://cool.worm.blog.163.com/blog/static/6433900620097535713944/
二、http://wenku.baidu.com/view/52edd773f46527d3240ce00d.html?qq-pf-to=pcqq.c2c
轉摘請說明出處:http://www.cnblogs.com/luochengor/p/3511165.html以及做者,謝謝。