首页Python【Python计算生态】g...

【Python计算生态】gTTS——文本转语音库

Python受欢迎的原因之一就是其计算生态丰富,据不完全统计,Python 目前为止有约13万+的第三方库。

本系列将会陆续整理分享一些有趣、有用的第三方库。

文章配套代码获取有以下两种途径:
  • 通过百度网盘获取:
链接:https://pan.baidu.com/s/1FSGLd7aI_UQlCQuovVHc_Q?pwd=mnsj 提取码:mnsj
  • 前往GitHub获取
https://github.com/returu/Python_Ecosystem





01
简介

gTTS(Google Text-to-Speech)是一个基于Google Translate APIPython第三方库,可以将语音数据以mp3格式写入文件、类似文件的对象(字节串),以便进一步进行音频处理,或者输出到stdout。它简单易用,具有灵活的预处理和分词功能,还支持多种语言和发音速度调整。
需要注意的是,如果无法访问Google的服务,gTTS会报错,这时候可能需要代理设置或者寻找替代方案。
直接使用pip安装:
pip install gTTS
GitHub页面:
https://github.com/pndurette/gTTS

02
使用

gTTS提供了命令行工具和Python库两种使用方式。

  • 命令行使用:
安装完成后,gtts-cli工具将可用。
通过以下命令使用Google Translate的文本转语音API<text>(要转换的文本内容字符串)读取为MP3格式:
gtts-cli [OPTIONS] <text>
[OPTIONS]包含以下可选参数:
  • -f, –file <file>:从<file>读取,而不是<text>
  • -o, –output <file>:写入<file>,而不是标准输出。
  • -s, –slow:读取速度更慢。
  • -l, –lang <lang>IETF语言标签。指定语音语言。使用–all列出所有已记录的标签。默认值为‘en’
  • t, –tld <tld>Google主机的顶级域名(例如https://translate.google.<tld>)。默认值为‘com’
  • –nocheck:禁用严格的IETF语言标签检查,允许使用未记录的标签。
  • –all:打印所有已记录的IETF语言标签并退出。
  • –debug:显示调试信息。
  • –version:显示版本并退出。
示例代码:
# 列出可用语言:
gtts-cli --all

# 将“hello”读取到hello.mp3:
gtts-cli 'hello' --output hello.mp3

# 将“你好”读取到你好.mp3(使用普通话,通过google.com.hk):
gtts-cli '你好' --tld .com.hk --lang zh-CN --output 你好.mp3

# 将“slow”以较慢的速度读取到slow.mp3:
gtts-cli 'slow' --slow --output slow.mp3

# 将“hello”读取到标准输出:
gtts-cli 'hello'
如果需要自动播放生成的音频,可以将gtts-cli的输出通过管道传输到任何支持stdin的媒体播放器。例如,使用SoXplay命令:
gtts-cli 'hello' | play -t mp3 -

  • Python模块使用:
以下是一个简单的示例,展示了如何使用gTTS将文本转换为语音并保存为MP3文件:
from gtts import gTTS
import os

# 输入文本
text = "Hello World!"

# 创建gTTS对象(India区域口音)
tts = gTTS(text=text, lang='en', slow=True, tld='co.in')

# 保存为MP3文件
tts.save("output.mp3")

# 在Windows上播放
os.system("start output.mp3")
# 在Mac上播放
# os.system("afplay output.mp3")
# 在Linux上播放
# os.system("mpg321 output.mp3")
参数说明:
  • text:要转换的文本内容(字符串)。需要注意的是,GoogleAPI可能对单次请求的文本长度有限制,过长的文本需要分多次处理。
  • lang:语言代码。gTTS支持多种语言,例如英语(‘en’)(默认)、中文简体(‘zh-cn’)、中文繁体(‘zh-tw’)、日语(‘ja’)、法语(‘fr’)、西班牙语(‘es’)等。完整列表可通过Google TranslateAPI文档查询。
  • slow:发音速度(旧版本支持)。False为正常速度,True为慢速(某些语言可能不支持)。
  • tld:域名后缀(可选)。例如:‘com’‘co.uk’,用于调整发音的区域口音。

03
预处理和分词

gtts.tokenizer模块是gTTS(Google Text-to-Speech)库的核心组件,用于对文本进行预处理和分词。它提供了默认的预处理和分词功能,并允许用户自定义这些功能,以满足不同语言和文本格式的需求。

  • 预处理(Pre-processing):
预处理的目标是修改文本,纠正发音问题,或者为分词做好准备。
可以将任意函数列表传递给gtts.tts.gTTSpre_processor_funcs属性,以作为预处理器(只要它接受字符串并返回字符串即可)。默认情况下,gtts.tts.gTTS采用以下预处理器列表,按顺序应用:
  • tone_marks:在语气修饰标点符号后添加空格,以便分词器正确处理。
  • end_of_line:重新组合被换行符截断的单词,移除行尾的连字符。
  • abbreviations:移除某些已知缩写后的句号,避免分词器错误处理。
  • word_sub:进行逐词替换,纠正发音或替换特定词汇。
该模块提供了两个类来帮助构建预处理器:
  • gtts.tokenizer.core.PreProcessorRegex类(用于基于正则表达式的替换,类似于re.sub的用法);
  • gtts.tokenizer.core.PreProcessorSub类(用于逐词替换)。
示例代码:
默认的替换对由gtts.tokenizer.symbols.SUB_PAIRS列表定义。通过将其附加到该列表中来添加自定义替换对。
本次示例通过word_sub替换特定词汇,将“sub.”替换为“submarine”
from gtts.tokenizer import pre_processors
import gtts.tokenizer.symbols

# 添加自定义替换规则
gtts.tokenizer.symbols.SUB_PAIRS.extend([
    ('sub.''submarine'),  # 替换 "sub." 为 "submarine"
    ('Mr.''Mister')       # 替换 "Mr." 为 "Mister"
])

# 测试文本
text = "Mr. Smith works on a sub. project."
processed_text = pre_processors.word_sub(text)

print(processed_text)
# 输出:"Mister Smith works on a submarine project."

  • 分词(Tokenizing):
分词的目标是将文本切割成较小的段落,确保每个段落不超过TTS API请求的最大字符限制(100字符),同时保持语音的自然和连贯性。
可以将任意函数传递给gtts.tts.gTTStokenizer_func属性,以作为分词器(只要它接受字符串并返回字符串列表即可)。默认的分词器gtts.tokenizer.core.Tokenizer使用以下分词器案例:
  • tone_marks:处理语气修饰标点符号。
  • period_comma:处理句号和逗号,避免在缩写或数字中错误切割。
  • other_punctuation:处理其他标点符号,自然地插入语音停顿。
  • colon:处理冒号,避免在时间表示中切割。
通过gtts.tokenizer.core.Tokenizer类和gtts.tokenizer.core.RegexBuilder类,用户可以定义自己的分词器案例,灵活处理不同语言和文本格式。
gtts还支持使用第三方分词器,只要可以限制输出标记的长度,就可以使用任何你喜欢的分词器,例如NLTK中的分词器。
当分词后的文本超过100字符Google Translate文本转语音API接受的最大字符数时,gtts会自动在合适的位置(如最后一个空格)进行分割:
  • 在最接近但位于第100个字符之前的最后一个空格字符处分割;
  • 如果没有空格,则在第100个和第101个字符之间分割。

示例代码:

自定义分词器,处理特定的标点符号。

from gtts.tokenizer import Tokenizer, pre_processors, tokenizer_cases
from gtts import gTTS

# 创建自定义分词器
custom_tokenizer = Tokenizer(
    regex_funcs=[
        tokenizer_cases.period_comma,          # 句号和逗号
        tokenizer_cases.colon,                 # 冒号
        tokenizer_cases.tone_marks,            # 问号和感叹号
        tokenizer_cases.other_punctuation      # 其他标点符号
    ]
)

# 原始文本
text = "Hello, this is an example. It includes abbreviations like Dr. and Mr.. " 
       "Are you ready? Let's go! This is an important announcement: " 
       "Please pay attention."

# 使用默认分词器
tts = gTTS(text)
tts.save("example.mp3")

# 使用自定义分词器
tts = gTTS(text, tokenizer_func=custom_tokenizer.run)  # 将自定义分词器传递给 gTTS
tts.save("custom_tokenizer_example.mp3")

# 验证分词效果
processed_text = custom_tokenizer.run(text)
print("原始文本:", text)
print("处理后的文本:", processed_text)
# 原始文本: Hello, this is an example. It includes abbreviations like Dr. and Mr.. Are you ready? Let's go! This is an important announcement: Please pay attention.
# 处理后的文本: ['Hello', 'this is an example', 'It includes abbreviations like Dr', 'and Mr.', 'Are you ready?', "Let's go!", 'This is an important announcement', ' Please pay attention.']


更多内容可以前往官方文档查看:

https://gtts.readthedocs.io/en/latest/


本篇文章来源于微信公众号: 码农设计师

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments