python文字转语音的五种方式win32com,pyttsx3,百度api,可使用自己的声音

转载自: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. 登录

百度AI开放平台-全球领先的人工智能服务平台

点击控制台登录

语音技术

在这里插入图片描述

创建一个应用
步骤省略

牢记这三个参数,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
 

  • 9
    点赞
  • 126
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值