Python使用微软edge接口编程生成最自然的合成语音

内容分享2个月前发布 jied_79
0 3 0

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

edge-tts 的安装和使用

在Python封装了edge-tts 这个包使用的是这个接口

Python使用微软edge接口编程生成最自然的合成语音

它需要如下几个包的支持,播放语音的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数组内容,我们就能听到不同对话了.

© 版权声明

相关文章

3 条评论

  • 头像
    志在四方 读者

    收藏了,感谢分享

    无记录
    回复
  • 头像
    杨培 读者

    是的音色也很多

    无记录
    回复
  • 头像
    灵魂深处有檀香 投稿者

    edge语音非常好听,关键中文也很好。

    无记录
    回复