?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
大概半月前写了一博文:C++中用Curl和JsonCpp调用有道译API实现在线译Q?得到大家的热情捧场,有h看了文章说要是能发声不是更好Q我觉得说的也是哈,能听C家的标准发音Q那该是多美的一件事Q那我就研究下呗。这D|间一直在忙着学习Unix Network Programming的东西,l于在今天下午抽出时间来完成q个事情?/p>
好了Q闲话不_我给大家说说我的语音辞典开发之旅吧Q开发环境Ubuntu + GCC4.7
一?声音从哪里来
要让辞典发音Q也是_我们需要得到这个单词的发音的音频,之前实现辞典用的是有道辞典的APIQ很好用Q所以这ơ也欣ƣ然选择有道发音API来得到单词的发音QAPI地址如下Q?/p>
1 http://dict.youdao.com/dictvoice?audio=%word_you_want_to_play%
诸如Q你要得到futuresq个单词的发韻I你只需要在览器输入http://dict.youdao.com/dictvoice?audio=futuresQ然后就可以听到一个女声的futures的发音了Q?/p>
二?怎么使用E序d?/strong>
1. 把声x回来
声音有了Q但是我们要自己实现E序Mq个事情Q难道我q每ơ去打开览器访问以下不成!NoQnoQ我没有惛_太好的办法,q我认为很土很W的Ҏ吧!
我把APIq回的声韛_成mp3文gQ然后再惛_法呗Q后来一惻I也有必要哈,把查q的q个单词存下来了Q如果一ơ没有听清楚Q我q可以再听一ơ撒Q那动手呗,把声韛_攑ֈ盘再说Q?/p>
我们需要用的三方库还是上一文章C++中用Curl和JsonCpp调用有道译API实现在线译用到的libcurlQ直接脓代码Q?/p>
复制代码
1 #include "curl/curl.h"
2
3 FILE *fp;
4
5 size_t voice_writer(void *ptr, size_t size, size_t nmemb, void *stream)
6 {
7 int written = fwrite(ptr, size, nmemb, (FILE *)fp);
8 return written;
9 }
复制代码
上面q个Ҏ在以下的代码中,也就是curl的回调中会用刎ͼ
复制代码
1 int main(int argc, char *argv[])
2 {
3 CURL *curl;
4 curl_global_init(CURL_GLOBAL_ALL);
5 curl = curl_easy_init();
6 std::string voice_url = "http://dict.youdao.com/dictvoice?audio=";
7 voice_url += argv[1];
8 curl_easy_setopt(curl, CURLOPT_URL, voice_url.c_str());
9
10 if((fp = fopen("voice.mp3", "w")) == NULL)
11 {
12 curl_easy_cleanup(curl);
13 exit(1);
14 }
15
16 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, voice_writer);
17 curl_easy_perform(curl);
18 curl_easy_cleanup(curl);
19
20 return 0;
21 }
复制代码
好了Q根据我的想法,~译q行之后一个voice.mp3的文件就攑֜了我的当前目录中Q(PSQ不是完整代码,其实差几个头文件而已Q自己加上吧Q)
2. 把声x出来
声音到手Q我先试着用播攑֙听了下,没错Q正是我惌的!下一个步骤,我们要在E序中把声音攑և来,M能每ơ用播放器去听吧QC++中如何播放mp3Q以前作VC开发的时候貌似遇到过Qlinux下我q是W一ơ面对这个需求,怎么办?问GOOGLEQ输入诸如C++ mp3 encoder libraryQ找了一圈,貌似也没个太好的库供我用,我可不喜Ƣ解码开始!肿么办?我想C另外一个方法,systemҎQ是的,你没看错Q就是他Q这个最拿手了,SoX大家应该都知道,SoX是Sound eXchange的简写,主页见这里。SoX在音频处理领域有瑞士军刀的美Uͼ支持很多格式的音频文Ӟ?WAV,MP3,MPG,OGG,FLAC {等Q没有安装的童鞋看这里:
1 sudo apt-get install sox
2 sudo apt-get install sox libsox-fmt-all
安装成功之后Q只需要用以下命令去播放既可Q?/p>
1 play voice.mp3
好了Q走q了Q我们l回到我们的systemҎ吧:
1 system("play voice.mp3");
Are you kidding me? 不好意思,我确实没有太好的Ҏ了!QPSQ有其他的C++库可以播放MP3Q有知道的朋友欢q指|我也很想用个比较perfect的方法!Q?/p>
三?结
好了Q这是今天的主要内容,使用之前的一文章中提供的辞典源码,和今天的发音源码整合CP是一个准perfect的在U发韌怺Q这里不再脓出所有源码,感兴的可以自己整合一下!