· 3 min read

免费使用微软文本转语音(TTS)服务

系统自带的文字转语音(TTS)不堪入耳,听了几分钟,耳朵严重不适。上传到微信读书可以使用微信读书的AI语音,但是考虑到平台限制等诸多因素,还是倾向于使用微软的TTS -- 最自然流畅的文本转语音,效果更佳。但是微软TTS属于付费服务,这里推荐一款借助edge浏览器接口免费使用的Python程序,开源免费。

系统自带的文字转语音(TTS)不堪入耳,听了几分钟,耳朵严重不适。上传到微信读书可以使用微信读书的AI语音,但是考虑到平台限制等诸多因素,还是倾向于使用微软的TTS -- 最自然流畅的文本转语音,效果更佳。但是微软TTS属于付费服务,这里推荐一款借助edge浏览器接口免费使用的Python程序,开源免费。

系统自带的文字转语音(TTS)不堪入耳,听了几分钟,耳朵严重不适。上传到微信读书可以使用微信读书的AI语音,但是考虑到平台限制等诸多因素,还是倾向于使用微软的TTS,效果更佳。但是微软TTS属于付费服务,这里推荐一款借助edge浏览器接口免费使用的Python程序,开源免费。

下载安装

如果是简单使用,可以只安装运行程序

### 先安装pipx,以mac为例
brew install pipx
### 然后安装edge-tts
pipx install edge-tts

或者使用rye安装edge-tts

rye install edge-tts

简单语句转换

直接命令行输入文本进行转语音,--voice参数必须选择中文,不然无法输出中文语音。

edge-tts --text "很可悲的是,我们今天社会上大多数人其实很少真正理解获得历史真实的价值与作用。因为,我们的历史教育几乎从来不教学生发现、尊重历史真实的方法和意义。" --write-media hello.mp3 --voice zh-cn-xiaoxiaoneural

可使用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

name: zh-hk-hiugaaineural
gender: female

name: zh-hk-hiumaanneural
gender: female

name: zh-hk-wanlungneural
gender: male

name: zh-tw-hsiaochenneural
gender: female

name: zh-tw-hsiaoyuneural
gender: female

name: zh-tw-yunjheneural
gender: male

电子书(批量文本)转语音

首先添加Python依赖

pip install edge-tts

或者使用rye添加依赖edge-tts

rye add edge-tts

使用python进行逐行读取转语音

from ebooklib import epub
import ebooklib
import asyncio
import edge_tts

input_file = './book.txt'
voice = "zh-cn-xiaoxiaoneural"
output_file = "book.mp3"

async def _main() -> none:
    with open(input_file) as f:
        for text in f.readlines():
            await asyncio.sleep(2) # 等待2秒,防止触发接口限频
            communicate = edge_tts.communicate(text, voice)
            with open(output_file, "ab") as file:
                async for chunk in communicate.stream():
                    if chunk["type"] == "audio":
                        file.write(chunk["data"])
                    elif chunk["type"] == "wordboundary":
                        print(f"wordboundary: {chunk}") # 忽略

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(_main())
    finally:
        loop.close()

参考

Back to Blog

Related Posts

View All Posts »
将豆瓣书影音迁移到NeoDB

将豆瓣书影音迁移到NeoDB

NiceDB是由志愿者托管的一个开源项目和免费服务,旨在帮助用户管理、分享和发现文化产品(例如图书、电影、音乐、播客、游戏和表演)的收藏、评论和评分。可以作为豆瓣评分的替代产品。