转载自:python文字转语音的五种方式win32com,pyttsx3,百度api,可使用自己的声音_m0_46140714的博客-CSDN博客
1. 安装win32com
python -m pip install pypiwin32
# pip install win32com
2. 导入并使用
import win32com.client
speaker = win32com.client.Dispatch(SAPI.SpVoice)
str1 = """
金樽清酒斗十千,玉盘珍羞直万钱。
停杯投箸不能食,拔剑四顾心茫然。
欲渡黄河冰塞川,将登太行雪满山。
闲来垂钓碧溪上,忽复乘舟梦日边。
行路难,行路难,多歧路,今安在?
长风破浪会有时,直挂云帆济沧海
"""
speaker.Speak(str1)
二、使用pyttsx3的语音库直接进行转换
1. 安装pyttsx3
pip install pyttsx3
2. 使用
代码如下(示例):
# 创建对象
engine = pyttsx3.init()
# 获取当前语音速率
rate = engine.getProperty('rate')
print(f'语音速率:{rate}')
# 设置新的语音速率
engine.setProperty('rate', 200)
# 获取当前语音音量
volume = engine.getProperty('volume')
print(f'语音音量:{volume}')
# 设置新的语音音量,音量最小为 0,最大为 1
engine.setProperty('volume', 1.0)
# 获取当前语音声音的详细信息
voices = engine.getProperty('voices')
print(f'语音声音详细信息:{voices}')
# 设置当前语音声音为女性,当前声音不能读中文
engine.setProperty('voice', voices[1].id)
# 设置当前语音声音为男性,当前声音可以读中文
engine.setProperty('voice', voices[0].id)
# 获取当前语音声音
voice = engine.getProperty('voice')
print(f'语音声音:{voice}')
# 语音文本
path = 'test.txt' #或者直接导入一个文本文件
words = """金樽清酒斗十千,玉盘珍羞直万钱。
欲渡黄河冰塞川,将登太行雪满山。
闲来垂钓碧溪上,忽复乘舟梦日边。
行路难,行路难,多歧路,今安在?
长风破浪会有时,直挂云帆济沧海。"""
# 将语音文本说出来
engine.say(words)
engine.runAndWait()
engine.stop()
三、使用特定或者本人的声音进行转换
前言
目前市面上的python文字转语音工具包都是已经实现封装好的(不能够我们娇滴滴想要的效果🤣),调用其他百度智能云或者腾讯智能云,还不免费😪,身为程序员的我们怎么可能被难到hhh,打破龙垄断,实现自由小康🤞奥里给
1. 文字转成拼音
将汉字通过xpinyin 包的方法转换成拼音
def chinese_phonetic(wenzi_data):
"""
:param wenzi_data: data
:return: 拼音
"""
p = Pinyin()
punc = '~`!#$%^&*()_+-=|\';":/.,?><~·!@#¥%……&*()——+-=“:’;、。,?》《{}'
wenzi_data = re.sub(r"[%s]+" % punc, "0", wenzi_data)
ret = p.get_pinyin(wenzi_data, tone_marks='numbers')
voi = ret.split('-')
return voi
2. 调整音频速度
def speed_change(sound, speed=1.2):
"""
:param sound:
:param speed: 音频速度
:return:
"""
sound_with_altered_frame_rate = sound._spawn(sound.raw_data, overrides={
"frame_rate": int(sound.frame_rate * speed)
})
return sound_with_altered_frame_rate.set_frame_rate(sound.frame_rate)
3. 调整声音大小
def Sound_Size(sound):
"""
:param sound:
:return: 调整声音大小
"""
sound = sound + 15
return sound
4. 文件保存地址
ef save_five(sound):
"""
:param sound:
:return: mp3
"""
sound.export(os.path.join(sys.path[0], 'vv.wav'), format="wav")
5. 入口函数
def main_voice(wenzi_data):
voi = chinese_phonetic(wenzi_data)
sounds = []
playlist = AudioSegment.empty()
for x, i in enumerate(voi):
i = i.lower()
try:
if i == '0':
sounds.append(AudioSegment.silent(duration=230, frame_rate=16000))#加入静音duration:时长
sounds.append(AudioSegment.from_wav("voice/" + i + ".wav"))
except:
print(i)
for sound in sounds:
playlist += sound
playlist = speed_change(playlist)
playlist = Sound_Size(playlist)
play(playlist)
save_five(playlist)
6. 总代码
import re
import os
import sys
from pydub import AudioSegment
from pydub.playback import play
from xpinyin import Pinyin
def chinese_phonetic(wenzi_data):
"""
:param wenzi_data: data
:return: 拼音
"""
p = Pinyin()
punc = '~`!#$%^&*()_+-=|\';":/.,?><~·!@#¥%……&*()——+-=“:’;、。,?》《{} \n'
wenzi_data = re.sub(r"[%s]+" % punc, "0", wenzi_data)
ret = p.get_pinyin(wenzi_data, tone_marks='numbers')
voi = ret.split('-')
return voi
def speed_change(sound, speed=1.2):
"""
:param sound:
:param speed: 音频速度
:return:
"""
sound_with_altered_frame_rate = sound._spawn(sound.raw_data, overrides={
"frame_rate": int(sound.frame_rate * speed)
})
return sound_with_altered_frame_rate.set_frame_rate(sound.frame_rate)
def Sound_Size(sound):
"""
:param sound:
:return: 调整声音大小
"""
sound = sound + 15
return sound
def save_five(sound):
"""
:param sound:
:return: mp3
"""
sound.export(os.path.join(sys.path[0], 'vvv.wav'), format="wav")
def main_voice(wenzi_data):
voi = chinese_phonetic(wenzi_data)
sounds = []
playlist = AudioSegment.empty()
for x, i in enumerate(voi):
i = i.lower()
try:
if i == '0':
sounds.append(AudioSegment.silent(duration=230, frame_rate=1600))
sounds.append(AudioSegment.from_wav("voice/" + i + ".wav"))
except:
# sounds.append(AudioSegment.silent(duration=10000, frame_rate=16000))
print(i)
for sound in sounds:
playlist += sound
playlist = speed_change(playlist)
playlist = Sound_Size(playlist)
play(playlist)
save_five(playlist)# 保存
p = """枯藤老树0昏鸦,小桥流水0人家,古道西风0瘦马。夕阳西下,断肠人0在天涯。
"""
main_voice(p)
提示:
多音节的汉字没有进行处理,感兴趣的可以自己写个方法进行处理
为了使阅读更加的流畅,将阅读的文字用0进行隔开
单独的音频文件voice:可以自己录取也可以从网上找一些已经处理好的
这个提供一个资源
链接:百度网盘 请输入提取码
提取码:eeft
用这种方式虽然可以实现自己造车轮子,但是实现的效果并不是很理想,
对比直接调用ap,我更倾向与后者,简单方便
四、调用百度语音api接口(人美声甜)
1. 登录
点击控制台登录
语音技术
创建一个应用
步骤省略
牢记这三个参数,api接口要用到
在概览中点击语音合成,领取两个免费的语音包
注意:如果没有领取免费的语音包接口接口将会中断执行
2. python代码
使用官方的py包进行操作,或者是使用request模块也是可以的
from aip import AipSpeech
app_id = ''
api_key = ''
secret_key = ''
client = AipSpeech(app_id,api_key,secret_key)
text = """枯藤老树昏鸦,小桥流水人家,古道西风瘦马。夕阳西下,断肠人在天涯"""
result = client.synthesis(text, 'zh', 1, {
'vol': 5,
'per': 4,
# spd String 语速,取值0-9,默认为5中语速 否
# pit String 音调,取值0-9,默认为5中语调 否
# vol String 音量,取值0-15,默认为5中音量 否
# per String 发音人选择, 0为女声,1为男声,
# 3为情感合成-度逍遥,4为情感合成-度丫丫,默认为普通女 否
})
# 识别正确返回语音二进制 错误则返回dict 参照下面错误码
if not isinstance(result, dict):
with open('audio.mp3', 'wb') as f:
f.write(result)
五、机器学习(感情机器)
既可以满足自己造车轮子,又可以实现很好的效果
这里来推荐一位github上的大佬
有兴趣的朋友可以看一下
学起来👨🦲👨🏻🦲👨🏼🦲👨🏽🦲👨🏾🦲👨🏿🦲
https://github.com/KuangDD/zhrtvc/tree/master/zhrtvc