Python + edge-tts:一行代码,让你的文本轻松变成语音!

Posted 树先生技术分享

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python + edge-tts:一行代码,让你的文本轻松变成语音!相关的知识,希望对你有一定的参考价值。

edge-tts 是一个Python的库,继承了微软 Azure 的文本转语音功能(TTS),且是免费使用的。该库提供了一个简单的 API,可以将文本转换为语音,并且支持多种语言和声音。
大家好,我是树先生!今天给大家介绍一个 Python 库 edge-tts,可以在本地轻松将文本转换成语音,非常方便,并且完全免费!
先来听一下效果:
怎么样?是不是很熟悉,影视解说中常用开头:这个女人叫小美。。。
 

edge-tts 介绍

edge-tts 是一个Python的库,继承了微软 Azure 的文本转语音功能(TTS),且是免费使用的。该库提供了一个简单的 API,可以将文本转换为语音,并且支持多种语言和声音。
只需要一行代码,即可将文本转换为语音!
edge-tts --text "Hello, world!" --write-media hello.mp3

 

详细步骤

1、安装 Python 环境,这里我用的 Python 3.11.1 开发环境,这一步不会的可以参考我之前发过的文章【保姆级】python最新版3.11.1开发环境搭建,看这一篇就够了(附PyCharm激活码)

2、安装 edge-tts 库。

pip install edge-tts

3、安装完成后,在 cmd 窗口中输入 edge-tts 命令,输出如下提示信息,说明已经安装完成。

4、尝试一下,生成第一个 TTS 语音吧,默认会在本地生成一个 hello.mp3 的音频文件。

edge-tts --text "Hello, world!" --write-media hello.mp3

5、这里使用的是默认的语音模型,你还可以通过 --list-voices 选项来查看可用的语音列表,然后通过 --voice 选项来选择你想要的声音。

edge-tts --list-voices
...

Name: zh-CN-XiaoxiaoNeural
Gender: Female

Name: zh-CN-XiaoyiNeural
Gender: Female

Name: zh-CN-YunjianNeural
Gender: Male

Name: zh-CN-YunxiNeural
Gender: Male

Name: zh-CN-YunxiaNeural
Gender: Male

Name: zh-CN-YunyangNeural
Gender: Male

Name: zh-CN-liaoning-XiaobeiNeural
Gender: Female

Name: zh-CN-shaanxi-XiaoniNeural
Gender: Female

...

edge-tts --voice zh-CN-YunxiNeural --text "你好,我是程序员树先生" --write-media hello_tree.mp3

6、你还可以通过 --rate 和 --volume 选项来调整语速和音量,-50% 代表降低语速/音量。

edge-tts --rate=-50% --text "Hello, world!" --write-media hello_with_rate_halved.mp3
edge-tts --volume=-50% --text "Hello, world!" --write-media hello_with_volume_halved.mp3

7、以上是在 cmd 命令行中执行的指令,我们也可以使用 python 进行读取文件内容转语音,直接献上代码。

import edge_tts
import asyncio

TEXT = ""
with open(\'C:\\\\Users\\\\Tree\\\\Desktop\\\\text2voicetest.txt\', \'rb\') as f:
    data = f.read()
    TEXT = data.decode(\'utf-8\')
print(TEXT)
voice = \'zh-CN-YunxiNeural\'
output = \'C:\\\\Users\\\\Tree\\\\Desktop\\\\text2voicetest.mp3\'
rate = \'-4%\'
volume = \'+0%\'


async def my_function():
    tts = edge_tts.Communicate(text=TEXT, voice=voice, rate=rate, volume=volume)
    await tts.save(output)


if __name__ == \'__main__\':
    asyncio.run(my_function())

在桌面创建一个 text2voicetest.txt 文件,写上你想写的内容,直接运行上述代码,即可生成相应的 MP3 文件,搞定!

 

使用场景

  • 你可以用它来为你的博客文章或者电子书添加语音朗读,让你的读者可以边听边学。
  • 你可以用它来为你的游戏或者动画添加语音配音,让你的角色更有个性和表现力。
  • 你可以用它来为你的 chatGPT 聊天机器人或者智能助理添加语音交互,让你的用户更方便和舒适。
  • 你可以用它来学习不同语言的发音,或者听取不同声音的风格和情感。
  • 你可以用它来在任何地方使用文本转语音服务,无论是云端、本地还是边缘设备。
 

项目地址

一行代码让你的python计算速度提高十倍

Python语言近年来人气爆棚。它广泛应用于数据科学,人工智能,以及网络安全问题中,由于代码可读性较强,学习效率较高,吸引了许多非科班的同学进行学习。然而,使用Python一段时间以后,发现它在速度上完全没有优势可言,特别是计算密集型任务里,性能问题一直是Python的软肋。本文主要介绍了Python的JIT编译器Numba,能够在对代码侵入最少的情况下,极大加速计算核心函数的运行速度,适合数据分析业务相关的同学使用。

首先要回答这样一个问题:当运行同一个程序时,为什么Python会 比其他语言慢2到10倍?为什么我们无法将它变得更快?

以下是最主要的原因:

  • “它是GIL(Global Interpreter Lock全局解释器锁)”

  • “它是解释型语言而非编译语言”

  • “它是动态类型语言

由于本文的着重点并不是解释Python速度慢的原因以及背后的逻辑,这部分就不深入探讨了,欢迎有兴趣的同学自行搜索🔍

Python的JIT编译器

为了兼具移植性和性能,聪明的工程师们发明了 JIT 这个东西,所谓的 JIT 就是说在解释型语言中,对于经常用到的或者说有较大性能提升的代码在解释的时候编译成机器码,其他一次性或者说没有太大性能提升的代码还是以字节码的方式执行。这样的话,就能在保证移植性的同时,又能让性能提升一大截,

JIT编译在代码运行时动态将Python代码编译为机器代码执行,由于避免了Python内置的解释器,运行速度会有很大提升。比较流行的JIT方案是Numba和Pypy,但由于Python的历史包袱和语法变化等原因,没有一个能够完美实现的方案。方案各自存在不同的优缺点,需要在根据使用领域选择合适的方案。

  • Pypy支持全局的加速,但对C库支持不好,较为适合用于Web服务等事务型任务。
  • Numba能够对某些函数和库进行加速,高性能的同时保持了Python的兼容性,但使用的范围会受到一定限制。

Numba快速学习

我们主要介绍Numba的基本用法,能够在对代码侵入最少的情况下,极大加速计算核心函数的运行速度,适合数据分析业务相关的同学使用。

Numba通过使用LLVM技术,将Python代码编译生成优化后的机器码,可以大幅提高代码执行效率。

对于Numba的学习,纽约大学提供了一套入门级别的视频,代码简单,纽约大学Numba快速学习,如果想要浏览中文文章欢迎继续往下看!

关于安装

首先是安装numba,根据python环境,运行不同的安装命令:

conda install numba
pip install numba

关于使用

一句话总结:使用Numba最简单的方式就是在函数定义前加@jit 或 @njit的装饰即可。

Numba通过在函数定义前加decorator(修饰符)来申明是否进行加速。如上文所说,最简单的使用方法是@jit。对于Numba的@jit有两种编译模式:nopython和object模式。

nopython模式会完全编译这个被修饰的函数,函数的运行与Python解释器完全无关,不会调用Python的C语言API。如果想获得最佳性能,推荐使用此种模式。同时由于@jit(nopython=True)太常用了,Numba提供了@njit修饰符,和这句话等价,方便使用。但这种模式要求函数中所有变量的类型都可以被编译器推导(一些基本类型,如不能是一些库或自己定义的数据类型等),否则就会报错。

object模式中编译器会自动识别函数中循环语句等可以编译加速的代码部分,并编译成机器码,对于剩下不能识别的部分交给Python解释器运行。如果想获取最佳性能,避免使用这种方法(For best performance avoid using this mode!)。

如果没设置参数nopython=True,Numba首先会尝试使用nopython模式,如果因为某些原因无法使用,则会使用object模式。加了nopython后则会强制编译器使用nopython模式,但如果代码出现了不能自动推导的类型,有报错的风险。

实验提升

from numba import jit
import random, time

def monte_carlo_pi(sam):
    account = 0
    for i in range(sam):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            account += 1
    return 4.0 * account / sam

@jit
def jit_monte_carlo_pi(sam):
    account = 0
    for i in range(sam):
        x = random.random()
        y = random.random()
        if (x ** 2 + y ** 2) < 1.0:
            account += 1
    return 4.0 * account / sam

loops = [100000, 1000000, 10000000, 100000000, 1000000000]

for loop in loops:
	startTime = time.time()
	monte_carlo_pi(loop)
	t = time.time() - startTime
	print('python  loop: '.format(loop, t))

	startTime = time.time()
	jit_monte_carlo_pi(loop)
	t = time.time() - startTime
	print('numba  loop: '.format(loop, t))
对于以上代码,运行的结果是:
python 100000    loop: 0.0469999313354
numba  100000    loop: 0.213999986649
python 1000000   loop: 0.478999853134
numba  1000000   loop: 0.0110001564026
python 10000000  loop: 4.82499980927
numba  10000000  loop: 0.107000112534
python 100000000 loop: 48.728000164
numba  100000000 loop: 1.05900001526
python 1000000000 loop: 489.142100134
numba  1000000000 loop: 11.01402001452

可以看到,jit编译后有约47倍的提升。循环次数越多,numba的加速效果就越明显。对于更复杂的计算函数,numba可能会有更好的效果。

以上是关于Python + edge-tts:一行代码,让你的文本轻松变成语音!的主要内容,如果未能解决你的问题,请参考以下文章

一行代码让你的python计算速度提高十倍

一行代码让你的python计算速度提高十倍

一行代码让你的python计算速度提高十倍

python代码检查工具pylint 让你的python更规范

用一行Python代码在几秒钟内抓取任何网站

用一行Python代码在几秒钟内抓取任何网站