专栏首页祥的专栏[Python]通过有道词典API获取单词发音MP3

[Python]通过有道词典API获取单词发音MP3

原创文章

原文链接:https://blog.csdn.net/humanking7/article/details/88630856


文章目录
  • @[toc]

  • 1. 原因
  • 2. 有道发音API介绍
  • 3.代码及其解释
  • 4. Next ...

Python通过有道词典API获取单词发音MP3

1. 原因

最近打算重新开始好好学英语,那当然从单词开始了。我最近好好研究了一下所谓的记忆神器Anki,然后自己做卡片(主要是用欧路词典的生词本功能记录生词,然后将网页版的欧陆词典的生词复制下来,自己写个Python脚本将其处理成Anki导入的文本,然后再用Anki的插件AwesomeTTS将卡片附上音频,AwesomeTTS也是用Python+PyQt4写的,牛逼啊,有机会了研究研究,不过感觉跑题了,主要还是为了学英语捂脸笑),学习起来感觉很不错,目前学了3个List(一共是30个List),以后看看会不会半途而废,看看这个Anki到底如何。

但是,这中间缺少了一个过程,听写,没错就是听写,初中,高中,甚至到了大学,最怕的听写,但是我现在不可能找个老师或者同学给我报听写吧,这感觉既二逼,又没操作性。找了市场上英语类的APP,不过失望的是,我没有找到(如果有朋友有,一定要给我说一下啊),但是活人不能让尿给憋死,自己动手丰衣足食,感觉没有什么难度,所以打算自己写一个听写软件,好,今天立下了Flag,开一个坑。

但是知易行难,本来打算用Python + PyQt,写一个听写软件,最后发现Python的发音库,简单粗暴,好用易行的都支持Python2,其他的要么太高端,要么说失真,所以改变策略,打算是Python3 + Qt,主要用Python去爬取MP3,然后用QT播放和控制MP3(窃以为用PyQt没有Qt写界面舒服便捷)。

所以先要有音频文件啊,怎么办,爬之。

2. 有道发音API介绍

为什么用有道的发音API?一方面,我是没去试几个;另一方面,有道的发音真不错(比微软的TTS标准好听多了)

调用有道词典的在线发音库: 美音:

http://dict.youdao.com/dictvoice?type=0&audio=

英音:

http://dict.youdao.com/dictvoice?type=1&audio=

api仅有两个参数,就是发音类型和单词,在audio=后面加上单词就ok了,type=0为美国发音,type=1为英国发音。

比个例子,美音 king 发音(点击链接): http://dict.youdao.com/dictvoice?type=0&audio=king

比个例子,英音 king 发音(点击链接): http://dict.youdao.com/dictvoice?type=1&audio=king

3.代码及其解释

使用说明: 调用youdao的API下载对应的单词发音。 判断语音库中是否有对应的MP3文件:

  • 如果有就不下载,返回MP3绝对路径地址
  • 如果没有,就下载MP3,返回MP3绝对路径地址

主要开放的就两个函数:

  • setAccent() : 调整语音库
  • getAccent() : 获取是什么语音库
  • down() : 下载MP3
'''
程序思想:
有两个本地语音库,美音库Speech_US,英音库Speech_US
调用有道api,获取语音MP3,存入对应的语音库中
'''

import os
import urllib.request


class youdao():
    def __init__(self, type=0, word='hellow'):
        '''
        调用youdao API
        type = 0:美音
        type = 1:英音

        判断当前目录下是否存在两个语音库的目录
        如果不存在,创建
        '''
        word = word.lower()  # 小写
        self._type = type  # 发音方式
        self._word = word  # 单词

        # 文件根目录
        self._dirRoot = os.path.dirname(os.path.abspath(__file__))
        if 0 == self._type:
            self._dirSpeech = os.path.join(self._dirRoot, 'Speech_US')  # 美音库
        else:
            self._dirSpeech = os.path.join(self._dirRoot, 'Speech_EN')  # 英音库

        # 判断是否存在美音库
        if not os.path.exists('Speech_US'):
            # 不存在,就创建
            os.makedirs('Speech_US')
        # 判断是否存在英音库
        if not os.path.exists('Speech_EN'):
            # 不存在,就创建
            os.makedirs('Speech_EN')

    def setAccent(self, type=0):
        '''
        type = 0:美音
        type = 1:英音
        '''
        self._type = type  # 发音方式

        if 0 == self._type:
            self._dirSpeech = os.path.join(self._dirRoot, 'Speech_US')  # 美音库
        else:
            self._dirSpeech = os.path.join(self._dirRoot, 'Speech_EN')  # 英音库

    def getAccent(self):
        '''
        type = 0:美音
        type = 1:英音
        '''
        return self._type

    def down(self, word):
        '''
        下载单词的MP3
        判断语音库中是否有对应的MP3
        如果没有就下载
        '''
        word = word.lower()  # 小写
        tmp = self._getWordMp3FilePath(word)
        if tmp is None:
            self._getURL()  # 组合URL
            # 调用下载程序,下载到目标文件夹
            # print('不存在 %s.mp3 文件\n将URL:\n' % word, self._url, '\n下载到:\n', self._filePath)
            # 下载到目标地址
            urllib.request.urlretrieve(self._url, filename=self._filePath)
            print('%s.mp3 下载完成' % self._word)
        else:
            print('已经存在 %s.mp3, 不需要下载' % self._word)

        # 返回声音文件路径
        return self._filePath

    def _getURL(self):
        '''
        私有函数,生成发音的目标URL
        http://dict.youdao.com/dictvoice?type=0&audio=
        '''
        self._url = r'http://dict.youdao.com/dictvoice?type=' + str(
            self._type) + r'&audio=' + self._word

    def _getWordMp3FilePath(self, word):
        '''
        获取单词的MP3本地文件路径
        如果有MP3文件,返回路径(绝对路径)
        如果没有,返回None
        '''
        word = word.lower()  # 小写
        self._word = word
        self._fileName = self._word + '.mp3'
        self._filePath = os.path.join(self._dirSpeech, self._fileName)

        # 判断是否存在这个MP3文件
        if os.path.exists(self._filePath):
            # 存在这个mp3
            return self._filePath
        else:
            # 不存在这个MP3,返回none
            return None


if __name__ == "__main__":

    sp = youdao()
    sp.down('reconcile')

4. Next …

那个最近比较忙,写好了软件就会写Blog,未完待续…

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 自学Python十 爬虫实战三

      我又来送福利啦!!!不同于上篇文章,这次我们的爬虫采用了多线程,一直以来被所谓的分布式  多线程  爬虫 给唬的怕怕的。今天就来一发多线程爬虫吧,还能看妹子...

    叁金
  • CenterNet的骨干网络之DLASeg

    CenterNet中使用的DLASeg是在DLA-34的基础上添加了Deformable Convolution后的分割网络。

    BBuf
  • python:爬取百度贴吧内容

    用户1215343
  • 接口自动化框架pyface详细介绍

    本框架系本人结合一些实践经验和开源框架设计思想,在家基于兴趣爱好独立完成的代码开发。

    dongfanger
  • IOS 自定义UITableViewCell 常用

    用户5760343
  • pythonpcap原生python读取

    本文代码都由python编写,无需安装第三方拓展库,代码更新:https://github.com/mengdj/python

    py3study
  • 深度强化学习之DQN实战

    今天我们会将我们上一篇文章讲解的DQN的理论进行实战,实战的背景目前仍然是探险者上天堂游戏,不过在下一次开始我们会使用OpenAI gym的环境库,玩任何我们想...

    CristianoC

扫码关注云+社区

领取腾讯云代金券