跨平臺TTS eSpeak Windows開發

轉摘請說明出處: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.libportaudio.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以及做者,謝謝。

相關文章
相關標籤/搜索