在发展中的科学技术领域,人工智能一词发挥着突出的作用,其最近的进步使人工智能获得了前所未有的普及,并使人工智能和机器学习的概念在大众中成为热门话题。人工智能发挥了关键作用,使机器能够从经验中学习,利用数据和数据处理更有效地执行任务。人工神经网络据说是受到人脑结构的启发,因此帮助计算机和机器更像人一样思考和处理。随着每一次发现和发展,人们对人工智能神经网络的最佳结构及其工作程序有了更多了解。
人工神经网络,也被称为ANN,是当今机器学习的关键工具。神经网络由输入和输出层以及架构中间的隐藏层组成,包含将输入变为输出的单元,以便输出层能够利用处理后的值。这样的工具对于寻找程序员要检索的大量和复杂的模式很有帮助,因此,机器被训练来识别有价值的模式。神经网络是由多个节点组成的,而这些节点又模仿人脑的生物神经元的工作。
神经网络中的神经元是相互联系的,它们在网络处理信息时不断地相互作用。输入节点可以接受输入数据并对数据进行多种操作。然后将这些运算得出的结果进一步传递给其他神经元。每个节点的输出被分配了一个激活值或节点值。这种处理技术模仿了人脑,因此成为开发可用于复杂模式和预测问题的算法的基础。由于有多个层次,它也被称为MLP或多层感知器。隐蔽层使网络更快、更有效,它只识别要从输入中处理的重要信息,通过关注分配的权重,从而排除多余的信息。
创建一个能提供准确预测的良好模型的关键是找到能使预测误差最小化的最佳权重值。这是通过实施一种被称为反向传播算法的方法来实现的。这种方法使ANN成为一种学习算法,因为从错误中学习;模型会自动改进。神经网络在很大程度上依赖训练数据来学习,并随着时间的推移提高其准确性。一旦这些学习算法的准确性得到微调,它们就成为强大的计算机科学和人工智能工具,使人们能够高速地对数据进行分类和聚类。诸如语音识别或图像识别等任务可以在几分钟内完成,而如果人类专家进行人工识别,则需要很长的时间。谷歌的搜索算法就是一个发展良好的神经网络的例子。大多数商业应用和商业公司使用这种技术来解决复杂的问题,如模式识别或面部识别。其他几个应用包括语音到文本转录、数据分析、检查处理的手写识别、天气预测和信号处理。
什么是差分数字信号处理?
DDSP或数字信号处理可以被称为现代社会的支柱之一,参考电信、交通、音频和许多医疗技术。数字信号处理器将语音、音频、视频、温度中的波形,然后对其进行数学处理。DSP的关键思想是通过精确控制和调整它们的许多参数来创造复杂、真实的信号。例如,如果频率和响应被调谐得恰到好处,一个线性滤波器和正弦振荡器的集合就可以用来创造一个逼真的小提琴声。
然而,有时很难手动控制所有这些参数,这就是为什么声音合成器的输出是不自然的和机器人式的。DDSP是一个开源库,它使用神经网络将用户的输入转换成复杂的DSP控制,可以帮助产生更真实的信号。输入可以是任何音频形式,包括从音频本身提取的特征。由于DDSP单元是可微分的,神经网络可以通过使用反向传播来训练以适应数据集。DDSP元素作为自动编码器的最终输出层。它结合了一个在许多不同频率上增加正弦波的谐波加法合成器和一个用时变滤波器过滤掉噪声的减法噪声合成器。然后,每个合成器的信号被合并,并通过混响模块运行,产生最终的音频波形。损失是通过比较生成的音频和源音频的频谱图在六个不同的帧大小上计算出来的。由于所有组件都是可分的,我们可以使用反向传播和随机梯度下降来训练网络的端到端。
代码入门
本文将使用DDSP库和神经网络来创建语音音频到音乐的转换器。该模型将把人类的语音音频作为输入,用模仿小提琴的音乐替换波形。我们还将对原始音频和处理后的音频进行比较,以注意到纯粹的差异。 以下代码是DDSP和Magenta的创造者的官方实现,其官方网站可以从这里的链接访问。
安装库
第一步是安装我们所需的库;你可以使用下面的命令来完成。
#Installing the Library
!pip install -qU ddsp==1.6.3
导入依赖项
此外,我们将导入依赖关系和辅助函数,以帮助建立我们的模型管道并为我们的音频转换器设置采样率。
#Importing necessary dependencies
import copy
import os
import time
import crepe
import ddsp
import ddsp.training
from ddsp.colab.colab_utils import (
auto_tune, get_tuning_factor, download,
play, record, specplot, upload,
DEFAULT_SAMPLE_RATE)
from ddsp.training.postprocessing import (
detect_notes, fit_quantile_transform
)
import gin
from google.colab import files
import librosa
import matplotlib.pyplot as plt
import numpy as np
import pickle
import tensorflow.compat.v2 as tf
import tensorflow_datasets as tfds
# Helper Functions
sample_rate = DEFAULT_SAMPLE_RATE # 16000
录制要处理的音频
此外,我们现在将为我们的模型提供一个5秒钟的语音音频记录作为输入,我们的模型管道将进一步处理它。
#recording audio
record_or_upload = "Record"
record_seconds =
if record_or_upload == "Record":
audio = record(seconds=record_seconds)
else:
filenames, audios = upload()
audio = audios[0]
audio = audio[np.newaxis, :]
print('\nExtracting audio features...')
# Plot.
specplot(audio)
play(audio)
# Setup the session.
ddsp.spectral_ops.reset_crepe()
# Computing the speech audio features.
start_time = time.time()
audio_features = ddsp.training.metrics.compute_audio_features(audio)
audio_features['loudness_db'] = audio_features['loudness_db'].astype(np.float32)
audio_features_mod = None
print('Audio features took %.1f seconds' % (time.time() - start_time))
TRIM = -15
现在让我们也绘制一下处理后的语音音频特征。
# Plot the Speech audio Features.
#Extracts fundamental frequency (f0) and loudness features
fig, ax = plt.subplots(nrows=3,
ncols=1,
sharex=True,
figsize=(6, 8))
ax[0].plot(audio_features['loudness_db'][:TRIM])
ax[0].set_ylabel('loudness_db')
ax[1].plot(librosa.hz_to_midi(audio_features['f0_hz'][:TRIM]))
ax[1].set_ylabel('f0 [midi]')
ax[2].plot(audio_features['f0_confidence'][:TRIM])
ax[2].set_ylabel('f0 confidence')
_ = ax[2].set_xlabel('Time step [frame]')
输出 :
注意:上述音频文件仅在执行时可以看到)。)
输出将播放你录制的5秒钟的语音音频片段,模型也会绘制出响度、频率和信心等特征。
加载要组合的音频模型
现在让我们把我们的语音音频与另一个单调的乐器音频结合起来,重新合成创造新的音频。我们在这里加载小提琴的乐器音频。
#Loading an audio model
model = 'Violin'
MODEL = model
# Iterate through directories until model directory is found
def find_model_dir(dir_name):
for root, dirs, filenames in os.walk(dir_name):
for filename in filenames:
if filename.endswith(".gin") and not filename.startswith("."):
model_dir = root
break
return model_dir
if model in ('Violin', 'Flute', 'Flute2', 'Trumpet', 'Tenor_Saxophone'):
# Load Pretrained models.
PRETRAINED_DIR = '/content/pretrained'
.
!rm -r $PRETRAINED_DIR &> /dev/null
!mkdir $PRETRAINED_DIR &> /dev/null
GCS_CKPT_DIR = 'gs://ddsp/models/timbre_transfer_colab/2021-07-08'
model_dir = os.path.join(GCS_CKPT_DIR, 'solo_%s_ckpt' % model.lower())
!gsutil cp $model_dir/* $PRETRAINED_DIR &> /dev/null
model_dir = PRETRAINED_DIR
gin_file = os.path.join(model_dir, 'operative_config-0.gin')
else:
# User models.
UPLOAD_DIR = '/content/uploaded'
!mkdir $UPLOAD_DIR
uploaded_files = files.upload()
for fnames in uploaded_files.keys():
print("Unzipping... {}".format(fnames))
!unzip -o "/content/$fnames" -d $UPLOAD_DIR &> /dev/null
model_dir = find_model_dir(UPLOAD_DIR)
gin_file = os.path.join(model_dir, 'operative_config-0.gin')
# Load the dataset statistics.
DATASET_STATS = None
dataset_stats_file = os.path.join(model_dir, 'dataset_statistics.pkl')
print(f'Loading dataset statistics from {dataset_stats_file}')
try:
if tf.io.gfile.exists(dataset_stats_file):
with tf.io.gfile.GFile(dataset_stats_file, 'rb') as f:
DATASET_STATS = pickle.load(f)
except Exception as err:
print('Loading dataset statistics from pickle failed: {}.'.format(err))
# Ensure dimensions and sampling rates are equal
time_steps_train = gin.query_parameter('F0LoudnessPreprocessor.time_steps')
n_samples_train = gin.query_parameter('Harmonic.n_samples')
hop_size = int(n_samples_train / time_steps_train)
time_steps = int(audio.shape[1] / hop_size)
n_samples = time_steps * hop_size
gin_params = [
'Harmonic.n_samples = {}'.format(n_samples),
'FilteredNoise.n_samples = {}'.format(n_samples),
'F0LoudnessPreprocessor.time_steps = {}'.format(time_steps),
'oscillator_bank.use_angular_cumsum = True',
]
with gin.unlock_config():
gin.parse_config(gin_params)
# Trim all input audio vectors to correct lengths
for key in ['f0_hz', 'f0_confidence', 'loudness_db']:
audio_features[key] = audio_features[key][:time_steps]
audio_features['audio'] = audio_features['audio'][:, :n_samples]
# Set up the model just to predict audio given new conditioning
model = ddsp.training.models.Autoencoder()
model.restore(ckpt)
# Build a model by running a batch through it.
start_time = time.time()
_ = model(audio_features, training=False)
print('Restoring model took %.1f seconds' % (time.time() - start_time))
创建我们的重新合成的音频
我们的最后一步是将我们的原始音频与我们加载的音频进行教学和处理,以创建独特的音频。
#Resynthesize Audio
af = audio_features if audio_features_mod is None else audio_features_mod
# Run a batch of predictions.
start_time = time.time()
outputs = model(af, training=False)
audio_gen = model.get_audio_from_outputs(outputs)
print('Prediction took %.1f seconds' % (time.time() - start_time))
# Plotting graph for comparison
print('Original')
play(audio)
print('Resynthesis')
play(audio_gen)
specplot(audio)
plt.title("Original")
specplot(audio_gen)
_ = plt.title("Resynthesis")
输出将包括两个音频,第一个是我们原来录制的语音音频,第二个是合成的音频。
现在我们可以在图表的帮助下清楚地观察到两者之间的差异。
结束语
在这篇文章中,我们探讨了什么是神经网络以及它的潜在用途。我们还使用神经网络和微分数字信号处理库建立了语音音频到音乐音频的转换模型。最后,我们对音频进行了处理、合成和比较,以注意它们之间的差异。下面的实施方案可以在Colab笔记本上找到,使用这里的链接访问。
学习愉快!
参考资料
The postHands-on Guide To Differential Digital Signal Processing Using Neural Networksappeared first onAnalytics India Magazine.