原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:https://cloud.tencent.com/developer/article/1596467
- @[toc]原因有道发音API介绍3.代码及其解释Next ...
Python通过有道词典API获取单词发音MP3
最近打算重新开始好好学英语,那当然从单词开始了。我最近好好研究了一下所谓的记忆神器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
写界面舒服便捷)。
所以先要有音频文件
啊,怎么办,爬之。
为什么用有道的发音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
使用说明:
调用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')
那个最近比较忙,写好了软件就会写Blog,未完待续…