使用Python将任正非400+篇演讲批量转化为语音

霸气任Boss

最近要说科技圈最火的公司,莫过于华为了。菊厂从5月15日美国商务部将华为列入“实体清单”开始,就一直处于风口浪尖。
先有 海思女总裁何庭波的一封信“备胎”转“正”!,掀起了一场关于自研芯片的讨论浪潮。
在到 任Boss的公开发言,表示美国此举并不能动摇华为根基,只能让华为的发展势头暂时变得缓慢。
后到 谷歌停止华为合作的轰炸消息,让我们对华为手机等移动设备在欧美市场更为担忧。
最近 又出现了所谓“ARM釜底抽薪”的事件,让大家对之前的海思B计划捏一把汗
之后 任总参加央视《面对面》节目,面对董倩独家专访时,闭口不谈压力,全程围绕着一个国家的强盛,是在小学教师的讲台上完成的主题而探讨。这150分钟的视频,让我看到的仿佛只是一名为祖国未来教育而努力的老者。
任总在21日记者问答时说的一句话让我着实佩服:

华为是一个商业公司,对于华为的产品,消费者喜欢就用,不喜欢就不用,不应该把华为的产品和政治挂钩

当时听到这句朴实的话,第一感觉就是,这才是一个企业家应有的气魄。面对一个国家的施压,我自泰然处之。
激动之余,我转手掏出了兜里的Mate 20X,然后看看桌子上老婆充电的mate 20 默默的说一句,菊长我尽力了...
不管这场风波最终结局如何,我们可以关注、讨论,但请大家保持一份冷静的心态。

GitHub上的任Boss演讲

昨天各大公众号突然不约而同的讨论,GitHub上有一个benmahr的用户,上传了400多篇任总从1994到2018年的相关演讲。可当我根据url去查找链接的时候,作者已经删除了该项目。还好当时有些用户clone了该项目,让我搜到并下载了这些文章。
看到这些文章都是以.md结尾的,且普遍排版风格单一,猜想应该也是一位Python爬虫的友军。至于为什么要转成MD格式,也许是程序员对于GitHub上文本类型的执念吧。用Markdown编辑器打开看了几篇文章,此处省略赞扬华为n句,不然大家都觉得我是推手了...
不得不说,任总的演讲在朴素的话语中,仿佛能感受到他逐步引领华为走向今天的成功。也许这位朋友就是觉得其中的内容,可能让老美分析出什么,所以才删除的吧。看着这么多的文章,让我觉得像是在读心灵鸡汤连载与名人语录般。
可我这人天生坐不住,书看一会儿就犯困。400多篇的文章,要让我逐篇赏析该看到什么时候,犯愁-ing...
思来想去,计上心来

懒人听书?

作为菊长的合作公司,任总在2019年第一封电邮讲话中,说到了华为今年将全面提升工程能力,并对产品高质量进行重点关注。对此电邮讲话,公司要求各部门认真学习。当时我心血来潮,使用python把文章用jieba进行了词频分析,最终将文章转化为语音分享给同事们。
回忆起这茬,那么这次的400多篇文章,我岂不是可以如法炮制的都转化成mp3文件,丢到手机里每天上下班坐车的时候慢慢听?说干就干!

语音识别

关于语音识别,Python的实现的方式很多种。

  1. 通过python的win32common模块,直接调用windows系统的语音去读取文章,无脑...
  2. 使用pyttsx3(python2是pyttsx)模块,但尽管模块内含很多设置,可发音还是基于windows系统自带的语音,只是没有上一种那么生硬,但依旧不好听。
  3. 使用API接口识别!

百度语音识别api:baidu-aip是百度开放的公共语音转化服务。只需要在百度注册相关的app及秘钥信息即可使用。

百度语音识别注册.png

使用流程如下:

  1. 访问语音合成-百度AI开放平台:http://ai.baidu.com/tech/speech/tts
  2. 之后使用百度账号即可登陆(没有百度账号的,自己注册一个)
  3. 创建应用,添加语音识别的功能,并完成注册
  4. 保存你的app_id, API_Key, Secret_Key 三项数据留着后续使用
  5. 切换回语音合成首页,点击立即使用旁边的技术文档按钮,进入API文档
  6. 定位 语音合成-->SDK文档-->Python SDK,即可看到详细的开发文档说明


    百度账号登陆.png

    image.png

接下来,我们看看文档中的相关说明:

  • 接口描述
    基于该接口,开发者可以轻松的获取语音合成能力
  • 请求说明
    合成文本长度必须小于1024字节,如果本文长度较长,可以采用多次请求的方式。文本长度不可超过限制
    举例,要把一段文字合成为语音文件:
from aip import AipSpeech

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipSpeech(APP_ID, API_KEY, SECRET_KEY)

result  = client.synthesis('你好百度', 'zh', 1, {
    'vol': 5,
})

# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
    with open('auido.mp3', 'wb') as f:
        f.write(result)

在上面代码中,常量APP_ID在百度云控制台中创建,常量API_KEY与SECRET_KEY是在创建完毕应用后,系统分配给用户的,均为字符串,用于标识用户,为访问做签名验证,可在AI服务控制台中的应用列表中查看。

参数 类型 描述 是否必须
text String 合成的文本,使用UTF-8编码,请注意文本长度必须小于1024字节
cuid String 用户唯一标识,用来区分用户,填写机器 MAC 地址或 IMEI 码,长度为60以内
speed String 语速,取值0-9,默认为5中语速
pit String 音调,取值0-9,默认为5中语调
vol String 音量,取值0-15,默认为5中音量
per String 发音人选择, 0为女声,1为男声,3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女

markdown转文本

由于这些发言都是MD结尾的文章,我们首先需要将这些文章,转化为文本后,才能进行相关转换操作。
之前私下里也用python操作过markdown,但都是基于HTML与MARKDOWN的互转,直接转成文本还没尝试过。
可否先转为html,在通过requests解析本地html,最终获得content呢?太麻烦了...
让我们先来看看简书上的markdown的语法有哪些:

# 一级标题
## 二级标题
##### 五级标题
- 列表第一项
- 列表第二项
1. 有序列表第一项
2. 有序列表第二项
[标题](链接地址)
![图片描述](图片链接地址)
*斜体*
**粗体**
> 引用段落
```代码块

我们是否可以用正则去过滤这些语法呢?

  1. 最麻烦的莫过于链接和代码块了
>>> test='测试:你[图片上传失败...(image-516d3b-1558963315309)]好[https://abc123.com](https://abc123.com)啊'
>>> re.sub(r'!?\[[^\]]+\]\([^\)]+\)','',test)
>>> '测试:你好啊'
  1. 之后针对# - > *一起匹配
  2. 至于代码块,放心不存在的....
    最终:
    re.sub(r'!?\[[^\]]+\]\([^\)]+\)|[\#\-\>\*]*','',test)

最终代码

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/5/25 20:20
# @Software : PyCharm
# @version  :Python 3.6.8
# @File     : speech.py

import os
import re
from aip import AipSpeech
import threading
import time


class FileToVoice:
    """
    将用户指定的文件(夹)中的文本内容,转化为语音
    """
    SIZE = 1024  # 百度aip单次转化长度限制

    def __init__(self):
        # AipSpeech秘钥,个人需单独修改...
        app_id = ''
        api_key = ''
        secret_key = ''
        self.client = AipSpeech(app_id, api_key, secret_key)
        func = self.read_dir()
        if func:
            func()

    def read_dir(self):
        """
        判断路径类型
        """
        if os.path.isdir(StartPath):
            # 返回文件夹遍历方法
            return self.ergodic_dir
        elif os.path.isfile(StartPath):
            self.change_file(StartPath)
        else:
            raise TypeError("未找到需要转化的文件(夹)...")

    def ergodic_dir(self):
        """
        百度API的转换速度基本为1000字12秒
        启用多线程并发,加快转换速度。
        """
        for root, dirs, files in os.walk(StartPath):
            base_dir = os.path.join(SavePath, os.path.split(root)[1])
            try:
                os.mkdir(base_dir)
            except FileExistsError:
                pass
            for file in files:
                filepath = os.path.join(root, file)
                t = threading.Thread(target=self.change_file, args=(filepath, base_dir))
                t.start()
                time.sleep(0.2)

    def change_file(self, file, base_dir='', per=0):
        try:
            sem.acquire()
            with open(file, 'r', encoding='utf-8') as f:
                mp3 = bytes()
                while True:
                    index = f.read(self.SIZE)
                    if not index:
                        break
                    _index = re.sub(r'!?\[[^\]]+\]\([^\)]+\)|[\#\-\>\*]*', '', index)
                    reult = self.client.synthesis(_index, 'zh', 1, {'vol': 5, 'per': per})
                    mp3 += reult
                # 获取文件名称并拼接MP3文件名
                file_name = '%s.mp3' % os.path.splitext(os.path.split(file)[1])[0]
                # 合并最终文件归档地址
                mp3_file = os.path.join(base_dir, file_name)
                with open(mp3_file, 'wb+') as t:
                    t.write(mp3)
                print('系统已转换完成 %s ' % mp3_file)
        except Exception as ErrorInfo:
            print(ErrorInfo)

        finally:
            sem.release()


if __name__ == '__main__':
    StartPath = r'D:\RenBossSpeech'
    SavePath = r"F:\Speech"
    try:
        os.mkdir(SavePath)
    except FileExistsError:
        pass
    sem = threading.Semaphore(5)
    main = FileToVoice()
    while threading.active_count() != 1:
        pass
    else:
        print('### FileToVoice Jobs is over!!!###')

百度在线的转换速度基本为1000字11秒,代码开了5线程去搞,400多篇下来也转了好久...


代码实现效果.png

看看我们转换号的语音吧:


音频文件展示.gif

喜欢的朋友可以去我的github下载源码,希望大家喜欢我的文章。
https://github.com/KingUranus/RenBossSpeech

©本文由简书作者:清风Python 原创 如需转载请注明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,663评论 6 531
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 98,125评论 3 414
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 175,506评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,614评论 1 307
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,402评论 6 404
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,934评论 1 321
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,021评论 3 440
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 42,168评论 0 287
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,690评论 1 333
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,596评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,784评论 1 369
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,288评论 5 357
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,027评论 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,404评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,662评论 1 280
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,398评论 3 390
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,743评论 2 370

推荐阅读更多精彩内容

  • “当初的欲望已成回忆” ——作家,伊塔洛 与众不同的思路:欲望变成了回忆。就像说鱼儿变成了花朵,或者美好变成了过往...
    書成的時光阅读 249评论 0 3
  • 通过一个PPT帖子,来到这里,意外惊喜 让今天加班的心情好起来了,想给自己说的话是:做时间的穷人,珍惜它,实现它的价值
    velly阅读 139评论 0 1
  • 网络系统 bootstrap允许将页面划分成共12个等宽逻辑单元,既允许单独地使用这12个等分逻辑单元,也可以将其...
    博为峰51Code教研组阅读 429评论 0 1
  • 父亲出于种种,自小偏爱顾雪度,对他的期许也仅是平安。 他是这父亲入主这帝都后出生的孩子,既是昭示着祥瑞,亦是上天厚...
    哎呀呀呀哎阅读 291评论 0 0
  • 读《你的口才价值千万》, 那么,沟通中分歧是怎么产生的呢? 因为我们没有意识到对于同一件事情存在“两个剧本”,每个...
    熊大大熊阅读 394评论 0 4