让使用讯飞TTS稍微方便一些。
讯飞TTS对单句的长度有一定限制,本方案除了包装打扫一些调用所需的常规外,主要是自动对长句子进行切分,使之满足讯飞TTS对于句子长度的要求,然后再合并成连贯的语音。并且在切分时务求在标点断句处进行切分,以避免诡异的语音中断。
我还没有搞定pip和conda的安装包(谁来教教我),所以您可以简单git clone,或者干脆把xunfei_tts.py 下载下来即可。
- Pydub
- 注意pydub是基于ffmpeg的,所以还需要安装ffmpeg。
- 在anaconda环境中,有可能ffmpeg调用出错,建议在所需env下使用conda进行ffmpeg的安装,
conda install -c menpo ffmpeg
比使用homebrew还要更好一些,各种解码器都自动装上了。
要使用讯飞TTS, 应先注册讯飞开放平台, 获得相应的key和ID, 并在讯飞填入自己的IP地址. 挺麻烦的, 参考这里
如果要将代码上载到公共网络,例如github,建议讲API信息单独存储为txt文件,例如API_sample.txt中演示的:
{
"key": "这里写入APIKey",
"id": "这里写入APPID",
"url": "http://api.xfyun.cn/v1/service/v1/tts"
}
如果不是使用的固定IP地址,那么每次更换IP以后都要去讯飞的控制平台上修改许可IP列表,修改后要过一两分钟才能生效。
- 简单文本朗读
python speak.py -t 'Hello world,这是一个测试' -s
- 文本朗读,保存为mp3文件
python speak.py -t 'Hello world,这是一个测试' -o 'test.mp3'
- 将文本文件转换成语音mp3文件
python speak.py -f test.txt -o test.mp3
- 将epub转换成语音mp3文件
python speak.py -e test.epub -o test.mp3
其中epub是由多个html构成,每个html文件会单独保存成一个mp3文件:test_001.mp3, test_002.mp3, ...
from xunfei_tts import Speech as xf_Speech
# 需要导入API信息
with open('API_sample.txt') as json_file:
api = json.load(json_file)
s=xf_Speech(api)
text="你好世界,hello world"
s.play(text)
s.save(text,"hello_world.mp3")
如果需要指定TTS中的参数,可以分别指定
- voice_name: 发音人:讯飞免费自带的有:xiaoyan,aisjiuxu,aisxping,aisjinger,aisbabyxu。还有很多更高质量的语音,可以免费试用15天。默认 voice_name='aisjiuxu'
- audio_type: 从讯飞取回音频的格式:mp3或wav,默认 audio_type="mp3"
- speed: 朗读速度,0-100,默认 speed="60"
- volume: 音量:0-100,默认 volume=100
- pitch: 音高:0-100,默认 pitch="30"
- engine_type: 引擎类型。aisound(普通效果),intp65(中文),intp65_en(英文),后两种似乎免费版用不了。默认 engine_type="aisound"
from xunfei_tts import Speech as xf_Speech
# 需要导入API信息
with open('API_sample.txt') as json_file:
api = json.load(json_file)
# 个性化设定语音
s=xf_Speech(api,
voice_name='aisjiuxu',
speed="80",
pitch="50")
text="你好世界,hello world"
s.play(text)
s.save(text,"hello_world.mp3")
from xunfei_tts import Speech as xf_Speech
from io import BytesIO
# 需要导入API信息
with open('API_sample.txt') as json_file:
api = json.load(json_file)
# 个性化设定语音
s=xf_Speech(api,
voice_name='aisjiuxu',
speed="80",
pitch="50")
text="你好世界,hello world"
s.play(text)
f=BytesIO()
s.savef(text,f)
讯飞TTS在使用上有一定限制,其中每日API调用次数是500次,注意是次数,不是语句长度。
对于每句话的长度要求是:"待合成文本,使用utf-8编码,需urlencode,长度小于1000字节",大约是300-450个中文单字。我在代码中以 MAX_SEGMENT_SIZE = 300进行了限定。
不过如果每次充分利用300多字的长度,每天也可以念出十万字左右。一般个人使用也够了。
如果不是使用的固定IP地址,那么每次更换IP以后都要去讯飞的控制平台上修改许可IP列表,修改后要过一两分钟才能生效。