我有一个需求,需要将英语文章的句子,一句句转成音频。我之前使用的网站,一个AI TTS 的在线网站,生成的音频挺拟人的。我对比过好几个类似网站,它家做的最好,而且网站也挺简洁,使用方便。最开始我还想使用微软的 TTS,发现这家做的不错,也懒得折腾了。
一直到今天,发现这网站大改版,竟然不能下载音频了。一时半会还挺头痛,突然想起 OpenAI 好像提供了 TTS 的 API。一搜索还真是,听了网页上的示例音频,卧槽,它生成的音频更真实,而且还有停顿和轻重音,发音速度也刚刚好,没对比就没差距,这个音频比之前的好太多了。
我想着 GitHub 应该有这个 API 的开源项目,可以部署一个 TTS 的在线网站,我到时候只要填入 KEY ,就能网页上使用这个文本转语音功能。结果好像没找到,没办法,只能自己来。花了一个小时,搭配 ChatGPT4 ,实现了一个 Python 脚本,只要在电脑终端上运行这个 Python 脚本,复制粘贴要转写的文本,就能在目录下生成音频。还真不说,挺好用的。
这使用过程也很简单,创建一个 text_to_speech_converter.py
文本,将下面的代码拷贝到文本保存。在目录下打开终端,假设你的电脑有 Python 环境,那接下来只要设置环境变量,设置一个名字叫 OPENAI_API_KEY
的环境变量,值就是 OpenAI 的 KEY(使用 GPT 3.5 就行了)。
关于这环境变量我再多说一句,我们可以配置永久的环境变量,也可以设置临时的(仅对当前终端会话有效)。Windows 和 macOS 的配置方法不一样,Windows 用户自己去搜一下,我也贴一个 GPT 的回答,仅供参考。
Windows
右击“此电脑”或“我的电脑”,选择“属性”。
点击“高级系统设置”。
在“系统属性”窗口中,点击“环境变量”。
在“环境变量”窗口,点击“新建”来创建一个新的系统变量。
在“变量名”中输入OPENAI_API_KEY,在“变量值”中输入您的 API 密钥。
点击“确定”保存。
macOS 就是修改 .bash_profile
文件,在终端打开这个文件,使用 Vim 添加保存。
sudo vim ~/.bash_profile
export OPENAI_API_KEY="您的API密钥"
source ~/.bash_profile
也可以在访达右键编辑添加,记得 source
生效。
上面都是永久配置,只要 KEY 的余额足够就可以一直使用,等有效期过了或者没钱了,重新替换更新。也可以临时设置,每次打开终端都配置一次。
Windows
set OPENAI_API_KEY=您的API密钥
macOS
export OPENAI_API_KEY=您的API密钥
搞定环境变量就直接执行这脚本 python3 text_to_speech_converter.py
。
我这默认你的电脑是安装了 Python ,如果没有安装,网上找一下教程,我这不分享了。下面是脚本代码。
import os
import random
import string
from pathlib import Path
from openai import OpenAI
def random_filename(extension='mp3'):
"""生成一个随机文件名"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=9)) + '.' + extension
def main():
client = OpenAI(api_key=os.environ['OPENAI_API_KEY'])
# 选择音色
print("请选择音色:")
print("1. 正式 (alloy)")
print("2. 故事 (echo)")
choice = input("输入序号选择音色:")
voice = "alloy" if choice == "1" else "echo"
print(f"音色选择成功:{'正式' if voice == 'alloy' else '故事'}")
while True:
# 获取用户输入的文本
text_to_convert = input("\n请输入要转换的文本(或输入'exit'退出):")
if text_to_convert.lower() == 'exit':
break
# 设置文件路径
speech_file_path = Path(__file__).parent / random_filename()
# 使用Text-to-Speech功能
response = client.audio.speech.create(
model="tts-1",
voice=voice,
input=text_to_convert
)
# 将响应流写入文件
response.stream_to_file(speech_file_path)
print(f"音频已生成:{speech_file_path}")
if __name__ == "__main__":
main()
还挺激动的,不是因为其他,而且想起很早看到的一句话,“穷则变,变则通,通则达”,有时碰到一件坏事,也不一定是坏事,很多路走不通时,只能硬着头皮去找突破口。比如这里,要是这网站可以继续使用,我肯定不会找到这个好用的 TTS ,又不贵又好用,之前的网站下载虽然方便,但也没这个脚本方便,真不错。
本文由老郭种树原创,转载请注明:https://guozh.net/make-a-tool-using-openai-tts/