如何利用 Azure 为 TEASOFT视频配音?
Posted 卓晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何利用 Azure 为 TEASOFT视频配音?相关的知识,希望对你有一定的参考价值。
简 介: 本文测试了将AZure的文本生成的语音信号分割成不同的片段,适合进行视频的后期配音。 分割利用了每一段语音之间的 0.5 秒中的间隔,这样可以将每一段的语音对应的分割出来。
关键词
: AZure
01 文字转语音
一、背景介绍
如下是Azure网站提供的文字转换成语音的界面。 文本转语音
▲ 图1.1.1 MicroSoft AZure文字转语音网站界面
二、转换步骤
TEASOFT语音配音的转换布置:
- 将TEASOFT配音导出;
- 转换到Azure网站进行播放,同期使用 Audacity进行录制;
- 将录制的语音进行切分。使用时长完成切分,存储在语音命名的 .MP3, .WAV 文件中;
播放语音是完成这部分的语音播放。
1、TEASOFT导出文字
利用BSIRFORM上的 “Action” 按钮生成视频配音文字。 具体操作: alt+点击Action 。
▲ 图1.2.1 生成文字按钮
TEASOFT 生成文字时,每一个Action中的文字形成一行。并对每一行进行如下的处理:
- 将其中的句号“。”,修改成逗号“,”。
- 将其中的半角句号空格“. ”,修改成逗号空格。
下面是转化后的文字样本。
今天在Youtube上,
看到一位Up主介绍了波形折叠电路,
并展示了它应用在电子音乐信号处理方面,
那么什么是波形折叠?
如何利用电路来实现呢?
首先讨论一下什么是波形折叠?
以这三个波形为例进行说明,
对于三角信号波形,
如果它的幅值超过一个阈值,
上面的波形则镜像折叠到阈值下面,
这就是波形折叠,
对于锯齿信号波形,
同样,
进行折叠之后,它变成了三角波,
对于方波信号,
信号折叠之后,
波形仍然是方波,
只是幅值下降,
波形没有变化,
下面,
如何利用电路来实现呢?
视频中给出了从简单到复杂的实现方法,
下面对此进行测试一下,
下面搭建单管折叠电路,
总共有三个器件,
这是电路原理图,NPN三极管使用8050.
从MSO24的信号源输出500Hz,
峰峰值为5V的三角波,
蓝色波形是输出的波形,
这是读入内存后的波形数据,
下面测量PNP折叠电路,
这是电路输出波形,
从MSO24读取的波形数据,
将上面两个电路并联在一起,形成双边这点电路,
这对峰峰值为1V的三角波处理结果,
调整不同幅值,
可以看到折叠信号始终维持在正负0.25V之内,
本文讨论了波形折叠电路,
根据Youtube上的UP主介绍的简单点路,
搭建了基于三极管的波形折叠电路,
验证了相关电路的工作原理,
2、AZure 文字转换语音
进入 AZure 文本转语音界面。 文本转语音 : https://azure.microsoft.com/zh-cn/products/cognitive-services/text-to-speech/#overview
▲ 图1.2.2 文本转语音界面
将上述文字拷贝到界面中的对话框内。选择合适的语言,语音,说话风格以及角色扮演等。
▲ 图1.2.3 播放参数设置
使用 Audacity软件进行录制语音合成结果,并存储到 .WAV 文件。
▲ 图1.2.4 利用Audacity对语音进行录制
下面是上述文本录制后的 MP3文件。
三、语音分割
1、语音分割原理
分割每个语音利用了每一段之间存在 0.675秒的时间间隔。 搜寻语音文件中所有长度大于等于 0.675 秒的时间间隔,将对应的数据存储在各自的语音文件中。
▲ 图1.3.1 语音之间的时间间隔
2、语音分割算法
根据 电话双音频拨码信号采集 所采用的 Python 对于语音处理的相关算法,进行上述合成语音的分割。
(1)语音文件读取
读取语音波形文件,获得相应的参数和数据。
from headm import *
from scipy.io import wavfile
wavefile = r'D:\\Temp\\11.wav'
sample_rate, sig = wavfile.read(wavefile)
printf(sample_rate, shape(sig))
保存的语音文件的采样率为 44100Hz,通过数量长度除以采样率,可以知道语音文件时间长度为 115.8s 。
44100
(5107840, 2)
绘制其中一个声道的数据波形如下:
▲ 图1.3.2 语音数据波形
(2)语音分割参数
对于上述录制的音频文件波形进行分析,获得语音分割参数:
-
语音分割参数:
-
静音幅值
: ±25
静音时间长度
: 0.5s
▲ 图1.3.3 分析语音分割参数
3、语音分隔程序
(1)程序代码
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# SPS.PY -- by Dr. ZhuoQing 2022-10-03
# Seperate speak signal into segment.
# Usage: sps wavefile silencevalue(int) silencetime(float)
#
# Before using sps, copy all voice string into clipboard.
#
# Note:
#============================================================
from headm import *
from scipy.io import wavfile
from pydub import Audiosegment
wavefile = r'D:\\Temp\\11.wav'
#------------------------------------------------------------
try:
if not os.path.exists(r'd:\\temp'):
os.makedirs(r'd:\\temp')
if not os.path.exists(r'd:\\temp\\VOICE'):
os.makedirs(r'd:\\temp\\VOICE')
except OSError:
printf("Error :Creating directory of data.")
#------------------------------------------------------------
silencevalue = 25 # Silence max value
silencetime = 0.5 #
mp3flag = 0
#------------------------------------------------------------
strall = [s.strip('\\r') for s in clipboard.paste().split('\\n') if len(s) > 0]
for s in sys.argv:
fname = os.path.join(r'd:\\temp', '%s.WAV'%s)
if os.path.isfile(fname):
wavefile = fname
continue
fname = os.path.join(r'd:\\temp', '%s.MP3'%s)
if os.path.isfile(fname):
wavefile = fname
mp3flag = 1
continue
if s.isdigit():
silcencevalue = int(s)
if silencevalue > 1000:
silencevalue = 1000
continue
if s.replace('.', '').isdigit():
silcentime = float(s)
printff(wavefile, silencevalue, silencetime)
#------------------------------------------------------------
if mp3flag == 0:
sample_rate, sig = wavfile.read(wavefile)
sigdata = array(sig[:,0])
else:
sample_rate = 44100
sound = AudioSegment.from_file(file=wavefile)
left = sound.split_to_mono()[0]
sig = frombuffer(left._data, int16)
sigdata = array(sig)
#------------------------------------------------------------
sigdata[(sigdata > -silencevalue) & (sigdata < silencevalue)] = 0
sigdata[(sigdata <= -silencevalue) | (sigdata >= silencevalue)] = 1
sigone = where(sigdata == 1)[0]
sigdelta = array([x2-x1 for x1,x2 in zip(sigone[0:-1], sigone[1:])])
deltamin = int(sample_rate*silencetime)
sigmax = where(sigdelta > deltamin)[0]
sigsegment =[sigone[0]]
for sm in sigmax:
sigsegment.append(sigone[sm+1])
sigsegment.append(sigone[-1])
#------------------------------------------------------------
printff('Voice Segment:%d'%len(sigsegment), 'Voice String:%d'%len(strall))
printf('\\a')
if len(sigsegment) - len(strall) != 1:
printf("Voice String Number error !\\a")
exit()
#------------------------------------------------------------
for i in range(len(sigsegment) - 1):
startid = sigsegment[i]
endid = sigsegment[i+1] - sample_rate*3//4
wavefilename = '%04d.wav'%i
if i < len(strall):
sa = strall[i].replace(',', '').replace(',','').replace('.','').replace('。', '').replace(';','')
wavefilename = '%s.wav'%sa
outfile = os.path.join(r'd:\\temp\\VOICE', wavefilename)
if mp3flag == 0:
wavfile.write(outfile, sample_rate, sig[startid:endid, :])
else: wavfile.write(outfile, sample_rate, sig[startid:endid])
printf(outfile)
tspbeep(1800, 100)
#------------------------------------------------------------
# END OF FILE : SPS.PY
#============================================================
(2)程序用法
在 sps 命令后面可以添加 wave 文件, 静音幅度, 静音时间等参数。 需要注意的是, 在使用 sps 之前,需要将声音的文本拷贝到剪切板中。
分割后的文件存储在 d:\\temp\\VOICE 目录中。
四、分割测试
对于上述程序进行了测试,它准确的将所有的语音进行了分割。
▲ 图1.4.1 分割后的语音信号
※ 总 结 ※
本文测试了将AZure的文本生成的语音信号分割成不同的片段,适合进行视频的后期配音。 分割利用了每一段语音之间的 0.5 秒中的间隔,这样可以将每一段的语音对应的分割出来。
◎ 人声配音短片
ZVS振荡电路
◎ AZure配音短片
ZVS振荡电路AZURE配音测试版本
■ 相关文献链接:
● 相关图表链接:
- 图1.1.1 MicroSoft AZure文字转语音网站界面
- 图1.2.1 生成文字按钮
- 图1.2.2 文本转语音界面
- 图1.2.3 播放参数设置
- 图1.2.4 利用Audacity对语音进行录制
- 图1.3.1 语音之间的时间间隔
- 图1.3.2 语音数据波形
- 图1.3.3 分析语音分割参数
- 图1.4.1 分割后的语音信号
以上是关于如何利用 Azure 为 TEASOFT视频配音?的主要内容,如果未能解决你的问题,请参考以下文章