You are not logged in.

#1 2009-10-19 15:30:15

konglinglong
Member
Registered: 2009-10-15
Posts: 3

修改源码,让stardict直接用上mp3真人发音库,不用转wav

今天要用到stardict的真人发音库,发现有WyabdcRealPeopleTTS 和OtdRealPeopleTTS
两个库。WyabdcRealPeopleTTS的音质太差,不用。那就只有用OtdRealPeopleTTS了,
但OtdRealPeopleTTS是mp3格式的,stardict只能放wav格式的,还要把mp3转为wav,
本来转换一下不是问题,但转换后150M 的文件变成3G的文件,就算磁盘空间充足也不
是这样浪费的吧!何况这都可以存放很多部片子了~

由于我已经装了mplayer以及mp3解码器,以为在音效设置里面把play改为mplayer,
语音库路径改为/usr/share/OtdRealPeopleTTS就可以了。但修改后发现还是没发声。

决定下开源码来看一下,打开/stardict-3.0.1/src/readword.cpp一看,发现了问题所在

一、
bool ReadWord::RealTts_canRead(const gchar *word)
{   
    bool return_val = false;
    if (!ttspath.empty() && word && g_ascii_isalpha(word[0])) {
        std::string lowerword;
        const gchar *p = word;
        while (*p) {
            if (*p!=' ')
                lowerword+=g_ascii_tolower(*p);
            p++;
        }
        std::string filename;
        std::list<std::string>::const_iterator it;
        for (it=ttspath.begin(); it!=ttspath.end(); ++it) {
            filename = *it + G_DIR_SEPARATOR_S + lowerword[0] + G_DIR_SEPARATOR_S + lowerword + ".wav"; #1
            return_val = g_file_test(filename.c_str(), G_FILE_TEST_EXISTS); #2

            if (return_val)
                break;
        }
    }
    return return_val;
}

粗体标记第一句是找到wav文件的全路径,第二句是判断文件是否存在。由于是硬编定为wav,
所以前面修改音效设置是没有用的。

改为:
bool ReadWord::RealTts_canRead(const gchar *word)
{   
    bool return_val = false;
    if (!ttspath.empty() && word && g_ascii_isalpha(word[0])) {
        std::string lowerword;
        const gchar *p = word;
        while (*p) {
            if (*p!=' ')
                lowerword+=g_ascii_tolower(*p);
            p++;
        }
        std::string filename;
        std::list<std::string>::const_iterator it;
        for (it=ttspath.begin(); it!=ttspath.end(); ++it) {
            std::string suffix, aword;
            aword = *it + G_DIR_SEPARATOR_S + "a" + G_DIR_SEPARATOR_S + "a.mp3";
            if (g_file_test(aword.c_str(), G_FILE_TEST_EXISTS))
                suffix = ".mp3";
            else
                suffix = ".wav";
            filename = *it + G_DIR_SEPARATOR_S + lowerword[0] + G_DIR_SEPARATOR_S + lowerword + suffix;

            return_val = g_file_test(filename.c_str(), G_FILE_TEST_EXISTS);
            if (return_val)
                break;
        }
    }
    return return_val;
}

在/stardict-3.0.1/src/readword.cpp中有两个这样的地方,另一个在
void ReadWord::Command_read(const gchar *word)这个函数中,都这样改。

二、
在/stardict-3.0.1/src/conf.cpp中

#if defined(CONFIG_GTK) || defined (CONFIG_GPE)
    add_entry("/apps/stardict/preferences/dictionary/play_command", std::string("play"));
#endif

把play改为mplayer。这个其实可以在安装运行以后再手动设置。

先装好mplayer及mp3解码器,archlinux用户不用急着装,在PKGBUILD设置了信赖。

接着编译源码,进入/stardict-3.0.1

./configure PKG_CONFIG=/usr/bin/pkg-config --prefix=/usr --sysconfdir=/etc --mandir=/usr/share/man --disable-gnome-support --disable-schemas-install --disable-espeak --disable-gucharmap --disable-festival --disable-advertisement --disable-updateinfo

注意:要加上粗体标记的那些参数

make


好了,运行一下,没声?~
对了,把发音库拷到/usr/share/OtdRealPeopleTTS下面,
运行,还是没有声音~
从上面的代码我们可以看到,stardict只能读到/usr/share/OtdRealPeopleTTS下面路径和文件名都是小写的声音文件。
这么多文件要一个个手工修改?当然不是了~
我这里有个脚本,修改这么多文件就靠它了~
运行它后,再运行stardict应该就可以了

OtdRealPeopleTTS真人发音库下载地址:http://ubuntu:ubuntuftp@ftp.ubuntu.org. … TTS.tar.gz
修改好的源码:http://myfilestorage.googlecode.com/fil … .1.tar.bz2
convert脚本(打开可以看到使用方法):http://myfilestorage.googlecode.com/files/convert

由于这些天在学习使用archlinux,所以特意写了个PKGBUILD
http://myfilestorage.googlecode.com/files/PKGBUILD

Offline

#2 2009-12-31 15:12:27

YZMSQ
Member
From: Hangzhou,Zhejiang,China
Registered: 2009-11-18
Posts: 97

Re: 修改源码,让stardict直接用上mp3真人发音库,不用转wav

牛人啊。。。。。


This is the way the world ends
Not with a bang but a whimper
                            -------T·S·Eliot

Offline

#3 2010-02-16 06:44:11

oldherl
Member
Registered: 2008-08-31
Posts: 23

Re: 修改源码,让stardict直接用上mp3真人发音库,不用转wav

不是有TTS命令的设置吗?自己写一个脚本:

mplayer /path/to/"$1".mp3

不就完事了么。。。

Last edited by oldherl (2010-02-16 06:44:34)

Offline

#4 2010-05-19 17:26:07

zqyking
Member
From: HongKong
Registered: 2010-05-19
Posts: 29

Re: 修改源码,让stardict直接用上mp3真人发音库,不用转wav

呃~ C++ code

Offline

#5 2011-08-17 05:59:30

thomasxie
Member
Registered: 2010-02-12
Posts: 1

Re: 修改源码,让stardict直接用上mp3真人发音库,不用转wav

smile

Offline

Board footer

Powered by FluxBB