大概半月前写了一篇博文:C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译, 得到大家的热情捧场,有人看了文章说要是能发声不是更好,我觉得说的也是哈,能听到专家的标准发音,那该是多美的一件事,那我就研究下呗。这段时间一直在忙着学习Unix Network Programming的东西,终于在今天下午抽出时间来完成这个事情。

好了,闲话不说,我给大家说说我的语音辞典开发之旅吧!开发环境Ubuntu + GCC4.7

一、 声音从哪里来

要让辞典发音,也就是说,我们需要得到这个单词的发音的音频,之前实现辞典用的是有道辞典的API,很好用,所以这次也就欣欣然选择有道发音API来得到单词的发音,API地址如下:

 http://dict.youdao.com/dictvoice?audio=%word_you_want_to_play%

诸如,你要得到futures这个单词的发音,你只需要在浏览器输入http://dict.youdao.com/dictvoice?audio=futures,然后就可以听到一个女声的futures的发音了!

二、 怎么使用程序去发音

1. 把声音拿回来

声音有了,但是我们要自己实现程序去作这个事情,难道我还每次去打开浏览器访问以下不成!No,no!我没有想到太好的办法,就用我认为很土很笨的方法吧!

我把API返回的声音存成mp3文件,然后再想办法呗,后来一想,也有必要哈,把查过的这个单词存下来了,如果一次没有听清楚,我还可以再听一次撒!那动手呗,把声音先放到硬盘再说!

我们需要使用的三方库还是上一篇文章C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译用到的libcurl,直接贴代码:

 #include "curl/curl.h"

 FILE *fp;

 size_t voice_writer(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)fp);
return written;
}

上面这个方法在以下的代码中,也就是curl的回调中会用到:

 int main(int argc, char *argv[])
{
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
std::string voice_url = "http://dict.youdao.com/dictvoice?audio=";
voice_url += argv[];
curl_easy_setopt(curl, CURLOPT_URL, voice_url.c_str()); if((fp = fopen("voice.mp3", "w")) == NULL)
{
curl_easy_cleanup(curl);
exit();
} curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, voice_writer);
curl_easy_perform(curl);
curl_easy_cleanup(curl); return ;
}

好了,根据我的想法,编译运行之后一个voice.mp3的文件就放在了我的当前目录中!(PS:不是完整代码,其实就差几个头文件而已,自己加上吧!)

2. 把声音放出来

声音到手,我先试着用播放器听了下,没错,正是我想要的!下一个步骤,我们要在程序中把声音放出来,总不能每次用播放器去听吧!C++中如何播放mp3,以前作VC开发的时候貌似遇到过,linux下我还是第一次面对这个需求,怎么办?问GOOGLE,输入诸如C++ mp3 encoder library,找了一圈,貌似也没个太好的库供我使用,我可不喜欢解码开始!肿么办?我想到了另外一个方法,system方法,是的,你没看错,就是他!这个最拿手了,SoX大家应该都知道,SoX是Sound eXchange的简写,主页见这里。SoX在音频处理领域有瑞士军刀的美称,支持很多格式的音频文件,如 WAV,MP3,MPG,OGG,FLAC 等等!没有安装的童鞋看这里:

 sudo apt-get install sox
sudo apt-get install sox libsox-fmt-all

安装成功之后,只需要使用以下命令去播放既可:

 play voice.mp3

好了,走远了,我们继续回到我们的system方法吧:

 system("play voice.mp3");

Are you kidding me? 不好意思,我确实没有太好的方法了!(PS:有其他的C++库可以播放MP3,有知道的朋友欢迎指导,我也很想用个比较perfect的方法!)

三、 小结

好了,这就是今天的主要内容,使用之前的一篇文章中提供的辞典源码,和今天的发音源码整合到一起,就是一个准perfect的在线发音辞典了,这里不再贴出所有源码,感兴趣的可以自己整合一下!

用程序改变世界,我是敢想敢做的程序猿。感谢阅读,希望帮到大家!

C++调用有道翻译API实现在线翻译之发声篇的更多相关文章

  1. C++中使用Curl和JsonCpp调用有道翻译API实现在线翻译

    使用C++开发一个在线翻译工具,这个想法在我大脑中过了好几遍了,所以就搜了下资料,得知网络上有很多翻译API,这里我选择我平时使用较多的有道翻译API进行在线翻译工具开发的练习.翻译API返回的结果常 ...

  2. 利用有道翻译Api实现英文翻译功能

    有道翻译提供了翻译和查词的数据接口.通过数据接口,您可以获得一段文本的翻译结果或者查词结果.       通过调用有道翻译API数据接口,您可以在您的网站或应用中更灵活地定制翻译和查词功能. 第一步: ...

  3. 基于百度通用翻译API的一个翻译小工具

    前几天写了一个简单的翻译小工具,是基于有道翻译的,不过那个翻译接口有访问限制,超过一定次数后会提示访问过于频繁,偶然发现百度翻译API如果月翻译字符少于200万是不收取费用的,所以就注册了一个百度开发 ...

  4. 利用百度翻译API,获取翻译结果

    利用百度翻译API,获取翻译结果 translate.py #!/usr/bin/python #-*- coding:utf-8 -*- import sys reload(sys) sys.set ...

  5. 原生js简单调用百度翻译API实现的翻译工具

    先来个在线demo: js翻译工具 或者百度搜索js简单调用百度翻译API工具(不过有个小小的界面显示bug,我想细心的人应该会发现) 或者直接前往该网址:js翻译工具 或者前往我的github:gi ...

  6. 使用python在SAE上搭建一个微信应用,使用有道翻译的api进行在线翻译

    1. 准备,先在使用python一步一步搭建微信公众平台(一)中基本实现自动回复的功能后,接着在有道词典上申请一个key,http://fanyi.youdao.com/openapi?path=da ...

  7. 调用支付宝PHP接口API实现在线即时支付功能(UTF-8编码)

    这次在项目中要实现订单功能,所以要完成在线支付,在线支付一般有网银支付和第三方支付(支付宝.paypal等)这两种途径,未简单起见,先完成支付宝在线支付功能,由于项目基于Yii框架,且使用UTF-8编 ...

  8. 免费翻译API破解(简易翻译工具)

    思路:选取有道翻译,用fiddler抓取接口请求信息,提取相关请求参数,破解加密部分. 主要请求数据: i  :翻译文本 ts:时间戳 salt:ts +随机数 sign:加密信息,经过抓取信息,发现 ...

  9. 小白学Python——用 百度翻译API 实现 翻译功能

    本人英语不好,很多词组不认识,只能借助工具:百度翻译和谷歌翻译都不错,近期自学Python,就想能否自己设计一个百度翻译软件呢? 百度翻译开放平台: http://api.fanyi.baidu.co ...

随机推荐

  1. 巧用代理设计模式(Proxy Design Pattern)改善前端图片加载体验

    这篇文章介绍一种使用代理设计模式(Proxy Design Pattern)的方法来改善您的前端应用里图片加载的体验. 假设我们的应用里需要显示一张尺寸很大的图片,位于远端服务器.我们用一些前端框架的 ...

  2. UVA11478 Halum (差分约束)

    每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui). 最后就是要确定所有的x(u). 因为m越大,满足条件的边就越少,二分答案m. 对于一条边 ...

  3. UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)

    由于互相憎恨的骑士不能相邻,把可以相邻的骑士连上无向边,会议要求是奇数,问题就是求不在任意一个简单奇圈上的结点个数. 如果不是二分图,一定存在一个奇圈,同一个双连通分量中其它点一定可以加入奇圈.很明显 ...

  4. codeforce Gym 100500F Door Lock (二分)

    根据题意略推一下,其实就是问你满足(a*(a+1))/2 < m <= ((a+1)*a(a+2))/2的a和m-(a*(a+1))/2 -1是多少. 二分求解就行了 #include&l ...

  5. PAT (Basic Level) Practise (中文)- 1013. 数素数 (20)

    http://www.patest.cn/contests/pat-b-practise/1013 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有 ...

  6. Nuget使用备忘

    菜单:工具-库程序包管理器-管理解决方案的NuGet程序包,搜索,下载,安装 或者 工具-库程序包管理器-程序包管理器控制台,输入PM命令,如: install-package log4net 如果不 ...

  7. FMDB中的数据处理

    [self.db executeUpdate:@"create table test (a text, b text, c integer, d double, e double)" ...

  8. Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案

    第6题:工资部门将每个支付周期的雇员信息的列表保存到一个文本文件, 每一行的格式:<last name><hourly wage><hours worked> 编写 ...

  9. NOIP模拟赛 czy的后宫

    [题目描述] czy要妥善安排他的后宫,他想在机房摆一群妹子,一共有n个位置排成一排,每个位置可以摆妹子也可以不摆妹子.有些类型妹子如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了.假定每种 ...

  10. Protobuf有没有比JSON快5倍?用代码来击破pb性能神话

    转 http://www.sohu.com/a/136487507_505779 2017-04-26 07:58 程序设计 /58 /技术 导读:Google 的 Protocol Buffers ...