口播神器,基于Edge,微软TTS(text-to-speech)文字转语音免费开源库edge-tts
|
不能否认,微软Azure在TTS(text-to-speech文字转语音)这个人工智能细分领域的影响力是统治级的,一如ChatGPT在NLP领域的随心所欲,予取予求。君不见几乎所有的抖音营销号口播均采用微软的语音合成技术,其影响力由此可见一斑,仅有的白璧微瑕之处就是价格略高,虽然国内也可以使用科大讯飞语音合成进行平替,但我们只想要最好的那一个,本次我们使用免费的开源库edge-tts来实现文本转语音操作,薅微软edge的羊毛。
TTS文本转语音基础使用方式
首先安装edge-tts库:安装成功后,直接在终端运行edge-tts命令:显示帮助菜单即代表安装成功:- ➜ Downloads edge-tts
- usage: edge-tts [-h] [-t TEXT] [-f FILE] [-v VOICE] [-l] [--rate RATE] [--volume VOLUME] [-O OVERLAPPING]
- [--write-media WRITE_MEDIA] [--write-subtitles WRITE_SUBTITLES] [--proxy PROXY]
复制代码 随后输入命令:该命令可以将Edge浏览器中,内置的语言角色列表列出来:一望而知,几乎支持所有主流的通用语,Gender字段为合成语音的性别,Male代表男性,Female代表女性,zh开头的就是中文语音角色,这里以微软的小伊为例子:- edge-tts --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3
复制代码 该命令含义是通过zh-CN-XiaoyiNeural角色合成语音:"你好啊,我是智能语音助手"的内容,随后将音频流写入hello_in_cn.mp3文件。
程序返回:- Downloads edge-tts --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3
- WEBVTT
-
- 00:00:00.100 --> 00:00:00.525
- 你好
-
- 00:00:00.525 --> 00:00:00.912
- 啊
-
- 00:00:01.050 --> 00:00:01.238
- 我
-
- 00:00:01.238 --> 00:00:01.375
- 是
-
- 00:00:01.387 --> 00:00:01.700
- 智能
-
- 00:00:01.700 --> 00:00:02.050
- 语音
-
- 00:00:02.062 --> 00:00:02.550
- 助手
复制代码 程序会自动将时间轴和语音文本匹配输出,如此一来,连字幕文件也有了,可谓是一举两得,一箭双雕。
与此同时,我们也可以调整合成语音的语速:- edge-tts --rate=-50% --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3
复制代码 --rate参数可以通过加号或者减号同步加快或者减慢合成语音的语速。
亦或者,调整合成语音的音量:- edge-tts --volume=-50% --voice zh-CN-XiaoyiNeural --text "你好啊,我是智能语音助手" --write-media hello_in_cn.mp3
复制代码 --volume参数可以调整语音的音量。
遗憾的是,和微软Azure官方的语音合成库相比,开源的语音合成库并不支持基于标记语言 (SSML)的语音调优,比如语调、情绪的调整,但这毕竟是免费的,要求也不能太高了。
Python脚本语音合成
除了通过命令进行语音合成,edge-tts也支持在Python脚本,编辑test.py文件:- import asyncio
-
- import edge_tts
-
- TEXT = "你好哟,我是智能语音助手,小伊"
- VOICE = "zh-CN-XiaoyiNeural"
- OUTPUT_FILE = "/Users/liuyue/Downloads/test.mp3"
-
-
- async def _main() -> None:
- communicate = edge_tts.Communicate(TEXT, VOICE)
- await communicate.save(OUTPUT_FILE)
-
-
- if __name__ == "__main__":
- asyncio.run(_main())
复制代码 这里我们直接通过异步模式调用communicate实例的save方法,就可以并发异步生成语音合成的音频文件,非常方便。
也可以通过语音管理库来自动寻找我们需要的语言:- import asyncio
- import random
-
- import edge_tts
- from edge_tts import VoicesManager
-
- TEXT = "中文语音测试"
- OUTPUT_FILE ="china.mp3"
-
-
- async def _main() -> None:
- voices = await VoicesManager.create()
- voice = voices.find(Gender="Female", Language="zh")
-
- communicate = edge_tts.Communicate(TEXT, random.choice(voice)["Name"])
- await communicate.save(OUTPUT_FILE)
-
-
- if __name__ == "__main__":
- asyncio.run(_main())
复制代码 这里通过内置的VoicesManager库来随机挑选中文语音角色完成语音合成操作。
除此之外,也可以通过脚本将语音流和字母同步进行生成:- import asyncio
-
- import edge_tts
-
- TEXT = "这里是语音流测试"
- VOICE = "zh-CN-XiaoyiNeural"
- OUTPUT_FILE = "test.mp3"
- WEBVTT_FILE = "test.vtt"
-
-
- async def _main() -> None:
- communicate = edge_tts.Communicate(TEXT, VOICE)
- submaker = edge_tts.SubMaker()
- with open(OUTPUT_FILE, "wb") as file:
- async for chunk in communicate.stream():
- if chunk["type"] == "audio":
- file.write(chunk["data"])
- elif chunk["type"] == "WordBoundary":
- submaker.create_sub((chunk["offset"], chunk["duration"]), chunk["text"])
-
- with open(WEBVTT_FILE, "w", encoding="utf-8") as file:
- file.write(submaker.generate_subs())
-
-
- if __name__ == "__main__":
- asyncio.run(_main())
复制代码 这里异步调用之后,音频会写入test.mp3,而字幕文件则会写入test.vtt。后续则可以通过ffmpeg将生成的字幕文件叠加到视频中即可,请参见:基于Python3(Autosub)以及Ffmpeg配合GoogleTranslation(谷歌翻译)为你的影片实现双语版字幕(逐字稿)
结语
开源语音合成edge-tts库可以提高语音合成效率,并且极大地降低了语音合成门槛,为自动化视频剪辑铺平了道路,未来结合基于Stable-Diffusion算法的AI绘图框架,人工智能AI一键式绘制、配音、上字幕的一条龙服务指日可待。
来源:https://www.cnblogs.com/v3ucn/p/17186731.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|
|
|
发表于 2023-3-7 07:53:38
举报
回复
分享
|
|
|
|