天涯论坛

 找回密码
 立即注册
搜索
查看: 30|回复: 1

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

[复制链接]

2992

主题

2万

回帖

9910万

积分

论坛元老

Rank: 8Rank: 8

积分
99109210
发表于 2024-10-2 21:58:36 | 显示全部楼层 |阅读模式

在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数组内容,咱们就能听到区别对话了.





上一篇:文字转语音软件、开源工具、有语气有感情(附音频演示)
下一篇:即使拿了奖,他还是声叫作自己是个傻X
回复

使用道具 举报

3133

主题

2万

回帖

9996万

积分

论坛元老

Rank: 8Rank: 8

积分
99968644
发表于 3 天前 | 显示全部楼层
你的见解独到,让我受益匪浅,非常感谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|天涯论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-11-22 13:33 , Processed in 0.109794 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.