在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 importplaysoundimport 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,Im Sam!",
"Hello,Im Daming!"
]
someone = edge_tts.Communicate()
async def say(text):
print(text)
with tempfile.NamedTemporaryFile() astemporary_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数组内容,咱们就能听到区别对话了.
|