先写入文本,再通过百度语音引擎接口将文本合成指定的音频,然后保存到mp3文件。再通过
pydub第三方库将mp3文本转化为wav文件,然后利用wav库和pydub播放wav音频
写入文本案例:
text="测试文本1 2 3 4 5 6 7"
f = open("audiofile.txt", "w+")
f.write(text)
f.close()
总的代码包含两个文件,一个是音乐格式转换.py,另一个是百度语音引擎.py
其中音乐格式转换文件依赖ffmgeg.根据代码运行提示自行安装
环境支持:本人用的python3.7.3 32位版本,windows10 本程序不支持linux,其他windows版本及python版本自测
本程序依赖以下第三方库,建议提前安装好:
python32 -m pip install pyaudio
python32 -m pip install pydub
python32 -m pip install baidu-aip
总的代码:
音乐格式转换.py
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# File : 音乐格式转换.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date : 2019/6/3
import sys
import os
pypath = sys.executable
print(pypath)
def pipsetup(packname):
packcmd = "%s -m pip install %s" % (pypath, packname)
try:
p = os.popen(packcmd)
except UnicodeDecodeError:
print("返回文本的格式编码有问题!")
try:
print(p.read()) # 执行cmd并得到返回的字符串
except UnicodeDecodeError:
print("读取返回值失败,大概意思是编码不对,不过已经执行完毕了")
def starttool(mp3path, output, form="wav"):
if os.path.exists("ffmpeg.exe") and os.path.exists(
"ffplay.exe") and os.path.exists("ffprobe.exe"):
try:
from pydub import AudioSegment
except BaseException:
print("本地不存在音乐处理支持库,开始安装pydub...")
pipsetup("pydub")
from pydub import AudioSegment
# AudioSegment.converter = r"D:\ffmpeg\bin\ffmpeg.exe"
def trans_mp3_to_wav(filepath):
if os.path.exists(mp3path):
song = AudioSegment.from_mp3(filepath)
print(song)
song.export("res/%s" % output, format=form)
else:
print("目标文件不存在!")
trans_mp3_to_wav(mp3path)
else:
csdn_url = ""
ext_mpeg = os.path.exists("ffmpeg.exe")
ext_play = os.path.exists("ffplay.exe")
ext_probe = os.path.exists("ffprobe.exe")
print("请将ffmpeg.exe,ffplay.exe,ffprobe.exe程序放到本文件同目录后再执行!")
print("不会操作请访问作者csdn教程查看:%s" % csdn_url)
print(
"文件检测:ffmpeg.exe:%s,ffplay.exe:%s,ffprobe.exe:%s" %
(ext_mpeg, ext_play, ext_probe))
if __name__ == '__main__':
# pipsetup("pydub")
# starttool(r"C:\Users\dashen\Desktop\1688.mp3", "musc.wav")
starttool("res/txt2audio.mp3", "txt2audio.wav")
百度语音引擎.py
#!/usr/bin/env python3
# _*_ coding: utf-8 _*_
# File : 百度语音引擎.py
# Author: DaShenHan&道长-----先苦后甜,任凭晚风拂柳颜------
# Date : 2019/6/4
from aip import AipSpeech
import wave
import 音乐格式转换
file_object = None
aipSpeech = None
def default_init():
APP_ID = '16427879'
API_KEY = 'H1OOrfrsKCjZruv8SvWn3MHw'
SECRET_KEY = 'we2ppcpEQi5Qj4lMvIZG1fCcMo6ztYaF '
global aipSpeech
aipSpeech = AipSpeech(APP_ID, API_KEY, SECRET_KEY)
f = open("audiofile.txt", "w+")
text = "《我们都是追梦人》 。\
作曲 : 常石磊。\
作词 : 王平久,编曲 : 柒玖、于昊。\
每个身影 同阳光奔跑。 \
我们挥洒汗水 回眸微笑。\
一起努力 争做春天的骄傲。\
懂得了梦想,越追越有味道。\
我们都是追梦人,千山万水 奔向天地跑道。\
你追我赶 风起云涌春潮,海阔天空 敞开温暖怀抱,我们都是追梦人,在今天 勇敢向未来报到。\
当明天 幸福向我们问好,最美的风景是拥抱。\
啦……啦……啦……。\
每次奋斗 拼来了荣耀。\
我们乘风破浪 举目高眺。"
f.write(text)
f.close()
global file_object
file_object = open('audiofile.txt')
def playaudio(audio_file):
global pyadplay
import pyaudio
pyadplay = pyaudio
chunk = 1024 # 2014kb
wf = wave.open(audio_file, 'rb')
p = pyadplay .PyAudio()
stream = p.open(
format=p.get_format_from_width(
wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(chunk) # 读取数据
while True:
data = wf.readframes(chunk)
if len(data) == 0:
break
else:
print(data)
stream.write(data)
stream.stop_stream() # 停止数据流
stream.close()
p.terminate() # 关闭 PyAudio
print('wav音乐播放play函数结束!')
def start_t2a(spd=5, pit=5, vol=5, per=3):
"""
:param spd: 合成语音的讲话速度
:param pit: 合成语言的讲话音调
:param vol: 合成语言的音量
:param per: 发音人选择, 0为普通女声,1为普通男生,3为情感合成-度逍遥,4为情感合成-度丫丫,5为情感合成-小琪琪,默认为情感合成-度逍遥
:return:
"""
global file_object, aipSpeech
try:
n = file_object.read()
print(n)
finally:
file_object.close()
result = aipSpeech.synthesis(n, 'zh', 1, {'spd': spd, 'pit': pit,
'vol': vol, 'per': per,
})
print(result)
if not isinstance(result, dict):
with open('res/txt2audio.mp3', 'wb') as f:
f.write(result)
音乐格式转换.starttool("res/txt2audio.mp3", "txt2audio.wav")
if __name__ == '__main__':
default_init() # 加载百度语言应用 默认用的本人的,做商用请找到这个函数,在里面改成你们自己的。里面加载了一个测试用的文本
start_t2a(per=5) # 开始文字转语音最终生成wav文件
playaudio("res/txt2audio.wav") # 播放