zoukankan      html  css  js  c++  java
  • C++调用有道翻译API实现在线翻译之发声篇

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

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

    一、 声音从哪里来

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

    1 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,直接贴代码:

    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 }

    上面这个方法在以下的代码中,也就是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 }

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

    2. 把声音放出来

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

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

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

    1 play voice.mp3

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

    1 system("play voice.mp3");

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

    三、 小结

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

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

  • 相关阅读:
    判断开始时间不能小于结束时间
    angular1.0使用echarts点刷新再次调用echarts方法
    解决angular4.0打包后不能再继续打包
    html拼接+layer按钮
    angular.js+echarts
    nginx配置
    NET_Framework_4.0installer.rar
    IIS6.0开启gzip压缩
    IIS的应用程序池优化方法
    远程桌面连接电脑后键盘失灵解决
  • 原文地址:https://www.cnblogs.com/berlin-sun/p/OnlineDictionary.html
Copyright © 2011-2022 走看看