zoukankan      html  css  js  c++  java
  • 跨平台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库 拷贝到 portaudiosrchostapiasio目录下,即整个ASIOSDK文件夹放到portaudiosrchostapiasio目录下。

    2、安装DirectX库。

    3、 用VS2008打开portaudiouildmsvcportaudio.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 FilesMicrosoft DirectX SDK (June 2010)

    需要在工程内分别添加对DirectX SDK的头文件和lib的引用,即:

    C:Program FilesMicrosoft DirectX SDK (June 2010)include

    lib根据自己需要有32位的和64位的,本人用的是32位的

    C:Program FilesMicrosoft DirectX SDK (June 2010)libX86

    不然会提示,找不到dsound.h这个文件的错误。 

    编译生成的动态链接库portaudio_x86.dll、portaudio_x86.libportaudio.h是我们在eSpeak中可能要用到的。 

    解压espeak-1.47.11-source.zip,espeak-1.47.11-sourceplatformswindows目录下包含了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-sourcesrc下的文件全部拷贝到,espeak-1.47.11-sourceplatformswindowswindows_cmdsrc,不包括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 SettingsAdministrator>cd C:espeak-1. 47.11-source

    C:espeak-1.40.02-source> espeak --path="." -v en "hello"

    Can't read data file: 'espeak-dataphontab'

    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-sourcesrc下的文件拷贝到espeak-1.47.11-sourceplatformswindowswindows_dllsrc下不覆盖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以及作者,谢谢。

  • 相关阅读:
    运算符,可变不可变数据类型
    基本的数据类型
    Python_day1
    day2_操作系统
    git fetch 命令
    Git branch 命令
    tmux常用命令
    转载-struts中logic标签使用
    转载-SVN常用命令
    javascript判断图片加载完成的三种方法
  • 原文地址:https://www.cnblogs.com/luochengor/p/3511165.html
Copyright © 2011-2022 走看看