跨平台TTS eSpeak Windows開發


轉摘請說明出處: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.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);

雖然聲音難聽一點,但是也算可以。 

參考文章:

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以及作者,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM