在Python 下有好几种tts生成包,其中最全的是pyttsx3,可以离线生成,但是合成语音一般,众所周知,最接近于人类自然发音的接口是微软语音,几乎可以以假乱真,但是只能windows下在直接调用微软的语音sdk.而在微软给自己edge浏览器提供一个云端合成的版本,虽然在大段语音会卡顿,但是优点太多了,除了语音自然外, 可以在任意平台使用,我在ubuntu,Mac OSX均测试通过,第二是不需要api key ,直接就能调用.超级完美的使用.
edge-tts 的安装和使用
在Python封装了edge-tts 这个包使用的是这个接口

它需要如下几个包的支持,播放语音的playsound,mv
pip3 install playsound
pip3 install mpv
pip3 install edge-tts
命令行测试
根据生成文字对应的mp3
edge-tts --text "Hello,world!" --write-media hello.mp3
直接播放生成语音,它实际是把生成mp3直接播放
edge-playback --text "Hello, world!"
代码中使用edge-tts
它在提供一个简单生成语音的demo,这里注意使用了async关键字,表明生成语音是采用异步方式生成,这里的核心语句就 edge_tts.Communicate().run();
#!/usr/bin/env python3
"""
Example Python script that shows how to use edge-tts as a module
"""
import asyncio
import tempfile
from playsound import playsound
import edge_tts
async def main():
"""
Main function
"""
communicate = edge_tts.Communicate()
ask = input("What do you want TTS to say? ")
with tempfile.NamedTemporaryFile() as temporary_file:
async for i in communicate.run(ask):
if i[2] is not None:
temporary_file.write(i[2])
playsound(temporary_file.name)
if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main())
更复杂的例子参见作者写的srt字幕文件生成mp3 的包.
edge-srt-to-speech
这个有更复杂的调用,所有参数切换,列如更换语言,音色,音量等都是通过 edge_tts.Communicate().run();这个函数来切换的.
async for j in communicate.run(
text,
codec="audio-24khz-48kbitrate-mono-mp3",
pitch=arg["pitch"],
rate=arg["rate"],
volume=arg["volume"],
voice=arg["voice"],
boundary_type=1,
customspeak=bool(ssml_template),
):
改写的例子
我需要写一个例子,就是给定一个句子列表,依次生成语音并播放出来,由于这个包内部采用异步生成接口,因此必要改写成同步接口
import asyncio
import edge_tts
import tempfile
from playsound import playsound
#对话列表
dialogues =[
"Hello,I'm Sam!",
"Hello,I'm Daming!"
]
someone = edge_tts.Communicate()
async def say(text):
print(text)
with tempfile.NamedTemporaryFile() as temporary_file:
print(temporary_file.name)
async for i in someone.run(text):
if i[2] is not None:
temporary_file.write(i[2])
playsound(temporary_file.name)
# queue.task_done()
#---------异步主函数---------------
async def main():
"""
Main function
"""
print("Start talking")
for text in dialogues:
#创建一个异步任务
tasks = [asyncio.create_task(say(text))]
#等待任务结束
await asyncio.wait(tasks)
if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main())
其中的关键是两句,相当于主线程在等待语音生成线程结束再执行下一句
#创建一个异步任务
tasks = [asyncio.create_task(say(text))]
#等待任务结束
await asyncio.wait(tasks)
这样只要修改成dialogs数组内容,我们就能听到不同对话了.



收藏了,感谢分享
是的音色也很多
edge语音非常好听,关键中文也很好。