查看原文
其他

Python实现文字转语音功能

2017-05-08 王芽树 大邓带你玩python

请输入标题     bcdef

转载自知乎【王芽树】

https://zhuanlan.zhihu.com/p/26726297


知乎第一篇文章,本来想写一篇简单的单进程单线程爬虫教程的,可是知乎上这样的文章已经有很多了,而且写的好的挺多,我就不添堵了。下次有空的话写一篇多线程请求的爬虫教程。





在自然语言处理上,文字、音频互转是一个很关键的技术点。对于语音转文字,这个个人实现较为困难,我们可以使用语音转文字的软件或借助各API(如科大讯飞等)进行移植开发。不过文字转语音就相对而言容易实现很多了。


简言之, 汉字转语音实现就分为两步,第一步将汉字转为拼音,第二步通过拼音调用相匹配的音频文件。下面是具体的开发实例教程。

环境配置


开发环境:Windows

Python版本:3.x

外置模块准备:pygame(可直接在cmd命令行中pip install pygame安装)


汉字转拼音

我使用的是将汉字转为Unicode码,然后通过查询一个匹配文件(我使用的是unicode_pinyin.txt)获取该汉字的拼音,该文件中列有从4E00-9FA5标准汉字的Unicode编码所对应的拼音,外加一个落单的3007编码的“〇”。


文件如下:

文件链接:

https://pan.baidu.com/share/init?shareid=1866601421&uk=4013012087

提取密码:fge1


在大写拼音英文后的1,2,3,4,5分别表示一,二,三,四和轻声(注意到存在有多音字)


我们将其封装成一个函数,参数为一个全是汉字的字符串,返回是一个拼音字符串。(即chinese_to_pinyin("秋水共长天一色") 返回的是"QIU1 SHUI3 GONG4 CHANG2 TIAN1 YI1 SE4 ")


源码如下:

def chinese_to_pinyin(x):
   y = ''
   dic = {}
   with open("unicode_pinyin.txt") as f:
       for i in f.readlines():
           dic[i.split()[0]] = i.split()[1]
   for i in x:
       i = str(i.encode('unicode_escape'))[-5:-1].upper()
       try:
           y += dic[i] + ' '
       except:
           y += 'XXXX ' #非法字符我们用XXXX代替
   return y


说明:将该文件与"unicode_pinyin.txt"文件放在同一目录下,代码比较简陋,因为主要给大家讲实现教学,所以没有对多音字进行处理(所以默认使用第一个使用频率最高的音)


请输入标题     abcdefg

拼音转语音

这一步也比较简单,我们根据拼音调用相对应的单个音的音频文件即可。单个音的音频文件可以自己录或找人录,渠道有很多哦。注意文件格式,最好是mp3或wav文件。


部分文件展示如下:

我们将其置入一个vioce文件夹下。准备工作就做好了。


我们同样将汉字转语音封装成一个make_vioce函数,参数为一个汉字字符串,然后调用chinese_to_pinyin函数,返回值不重要,可为空,功能实现是调用音频文件发音。测试时请在Python自带的IDLE中运行。


源码如下:

import pygame
def make_vioce(x):
   pygame.mixer.init()
   vio = chinese_to_pinyin(x).split()
   for i in vio:
       if i == 'XXXX':  #处理'XXXX'的音,可将其忽略
           continue
       pygame.mixer.music.load("vioce/" + i + ".mp3")
       pygame.mixer.music.play()
       while pygame.mixer.music.get_busy() == True:
           pass
   return None


我们展示一下这个教学版的最后完整的代码图(该文件名为"test.py"):

import pygame

def chinese_to_pinyin(x):
   y = ''
   dic = {}
   with open("unicode_pinyin.txt") as f:
       for i in f.readlines():
           dic[i.split()[0]] = i.split()[1]
   for i in x:
       i = str(i.encode('unicode_escape'))[-5:-1].upper()
       try:
           y += dic[i] + ' '
       except:
           y += 'XXXX '
   return y

def make_vioce(x):
   pygame.mixer.init()
   vio = chinese_to_pinyin(x).split()
   for i in vio:
       if i == 'XXXX':
           continue
       pygame.mixer.music.load("vioce/" + i + ".mp3")
       pygame.mixer.music.play()
       while pygame.mixer.music.get_busy() == True:
           pass
   return None

while True:
   p = input("请输入文字:")
   make_vioce(p)

请输入标题     abcdefg

教程文件的文件树结构

test.py
unicode_pinyin.txt
vioce----A1.mp3
        A2.mp3
        A3.mp3
        ...

请输入标题     abcdefg

再次强调一下:这个教学test请在IDLE中运行,需要直接运行的话还需要做一些小调整。


实现原理就是这样,同时也可以视一些具体情况做一些拓展,例如将阿拉伯数字转汉字读法(即1234006.15读作“一百二十三万四千零六点一五”,这个实现不难),还有将多音字问题攻破也是很棒的。

当然只要想法够丰富用pygame的音频功能也能实现很多有趣的功能(如播放器制作或电子音乐简单创作等)。


我的表演完了,谢谢大家。如果这篇文章对您有帮助的话,请在收藏的同时一赞支持。光收藏不点赞的你们的良心不会痛吗😂


更多内容

文本分析

  python居然有情感??真的吗??  

  文本分析之网络关系 

  中文分词-jieba库知识大全

  自然语言处理库之snowNLP

  用gensim库做文本相似性分析

  基于共现发现人物关系的python实现

  用python计算两文档相似度

数据分析

酷炫的matplotlib

文本分析之网络关系  

pandas库读取csv文件

用词云图解读“于欢案”

神奇的python

  初识Python的GUI编程

 怜香惜玉,我用python帮助办公室文秘

 逆天的量化交易分析库-tushare     

 开扒皮自己微信的秘密

 8行代码实现微信聊天机器人

 使用Python登录QQ邮箱发送QQ邮件

爬虫

  爬虫实战视频专辑

【视频】手把手教你抓美女~

  当爬虫遭遇验证码,怎么办

【视频】于欢案之网民的意见(1)?

【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”

【视频】快来get新技能--抓包+cookie,爬微博不再是梦

【视频教程】用python批量抓取简书用户信息

  爬豆瓣电影名的小案例(附视频操作)

  爬豆瓣电影名的小案例2(附视频操作)

  用Python抓取百度地图里的店名,地址和联系方式



点击原文链接,即可直接关注作者知乎账号

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存