零成本实现文本转语音
这期内容我觉得比较适合自媒体创作者。虽然现在有不少云厂商提供文本转语音API,但不少客户端标榜免费却通过扣充值额度变相收费。本期将分享如何通过技术手段实现零成本文本转语音。无论是制作电商产品介绍,还是诗词讲解、童话、睡前听故事等有声读物,甚至将成品用于短视频创作或有声产品变现,这些技能都能派上用场。
本期提供两种实用方案:一是纯离线生成中文配音(基于本地语音包);二是在线生成多语言音频。
这是本地调好的脚本
import argparse
from datetime import datetime
try:from gtts import gTTSHAS_GTTS = True
except ImportError:HAS_GTTS = Falsetry:import pyttsx3HAS_PYTTSX3 = True
except ImportError:HAS_PYTTSX3 = Falsedef online_text_to_audio(text, lang='zh', output_file='text_to_audio.mp3', slow=False):"""在线文本转音频:param text: 要转换的文本:param lang: 语言代码,默认为中文(zh):param output_file: 输出音频文件路径,默认为 text_to_audio.mp3:param slow: 语速控制,True 为慢速,False 为正常语速,默认为 False"""if not HAS_GTTS:raise ImportError('gtts 库未安装,请执行 pip install gtts')if output_file == 'text_to_audio.mp3':timestamp = datetime.now().strftime("%Y%m%d%H%M%S")output_file = f"text_to_audio_{lang}_{timestamp}.mp3"tts = gTTS(text=text, lang=lang, slow=slow)tts.save(output_file)print(f"音频文件已保存为 {output_file}")def offline_text_to_audio(text, lang='zh', output_file='offline_text_to_audio.wav'):"""使用 pyttsx3 库进行离线文本转音频"""if not HAS_PYTTSX3:raise ImportError('pyttsx3 库未安装,请执行 pip install pyttsx3')timestamp = datetime.now().strftime("%Y%m%d%H%M%S")if output_file == 'offline_text_to_audio.wav':output_file = f"offline_text_to_audio_{lang}_{timestamp}.wav"engine = pyttsx3.init()voices = engine.getProperty('voices')for voice in voices:print(f"Name: {voice.name}, ID: {voice.id}")# 选择不同的语音,取决于操作系统和安装的语音包engine.setProperty('voice', voices[0].id)# 单位通常是每分钟单词数,通常在 0 到 200 之间 ,默认值为 200,越大越快engine.setProperty('rate', 170) # 语音播放的音量大小,范围从 0.0(静音)到 1.0(最大音量),值越小声音越小engine.setProperty('volume', 1.0) engine.save_to_file(text, output_file)engine.runAndWait()print(f"离线音频文件已保存为 {output_file}")if __name__ == '__main__':parser = argparse.ArgumentParser(description='文本转音频工具')parser.add_argument('text', help='文本转语音')parser.add_argument('--mode', choices=['online', 'offline'], default='online', help='转换模式,online 或 offline,默认为 online')parser.add_argument('--lang', default='zh', help='文本语言,仅在线模式有效,传入语言代码,默认为中文(zh)')parser.add_argument('--output', help='输出音频文件路径,不指定时,在线模式默认为 text_to_audio.mp3,离线模式默认为 offline_text_to_audio.wav')parser.add_argument('--slow', action='store_true', help='在线模式下,控制语速为慢速,不指定则为正常语速')args = parser.parse_args()if args.mode == 'online':output = args.output if args.output else 'text_to_audio.mp3'online_text_to_audio(args.text, args.lang, output, args.slow)else:output = args.output if args.output else 'offline_text_to_audio.wav'offline_text_to_audio(args.text, args.lang, output)
执行前先装好对应的库
pip install pyttsx3
pip install gtts
这里摘取纳瓦尔宝典里面的一句话测试离线方式
python text_to_audio.py "财富不是金钱,而是资产。财富是你睡觉时也能为你赚钱的东西。金钱只是社会给你打的欠条,而财富是你拥有的工厂、代码、知识产权或能产生现金流的资产。" --mode offline
在线生成英文的语音(需注意:在线方案通过Google免费API实现,使用时需开启VPN)
python text_to_audio.py "追求财富而非金钱。财富是能在你睡觉时依然为你赚钱的资产,而金钱只是转移财富的手段。真正的自由是脱离时间换金钱的陷阱,拥有对自己时间的绝对控制权。" --mode online --lang en --slow
如果是正常语速不用加–slow