前言
音频伪造技术,尤其是深度伪造(DeepFake)技术,是指利用深度学习算法合成虚假的音频内容,它可以模仿特定人的声音,生成与原声极为相似的合成语音。这种技术在娱乐、广告等领域有着合法的应用,但也存在被滥用的风险,特别是在诈骗和误导公众舆论等方面。随着技术的发展,音频伪造技术愈发难以辨识,给社会和个人带来了严重的安全隐患。
在本文中我们将使用AI技术来是实现对伪造音频的鉴别
其实大概的步骤就是:
通过对语音信号的特征进行分析,使用机器学习和深度学习算法来鉴别语音的真伪。这些技术通常包括以下几个步骤:
- 特征提取:从语音数据中提取特征,如频谱特征、时长特征、能量特征等。
- 模型训练:利用真实语音数据训练检测模型,使其能够区分真实语音和合成语音。
- 真伪判断:对未知语音进行真伪判断,若模型认为语音为伪造,则输出相应的警告
背景知识
我们在后续实战中会用到很多背景知识,这里先统一铺垫一下
频谱特征
频谱特征分析是一种将信号从时域转换至频域的技术,主要用于揭示信号中频率成分的分布。通过分析信号的频谱,可以提取信号的特征,检测信号中的异常,甚至实现信号的压缩和去噪处理。频谱分析的核心思想是通过傅里叶变换将时域信号转换为频域信号,进而分析信号的频率成分。
梅尔频谱特征
梅尔频谱特征提取技术是一种基于人耳听觉特性的音频信号处理方法,主要用于模拟人类对声音频率的非线性感知。该方法的核心在于梅尔刻度(Mel Scale),它将频率从线性尺度转换为非线性刻度,使得人耳对不同频率的感知差异变得一致。梅尔频被广泛应用于语音识别、音乐处理、语音合成等多个领域,因其能够更好地捕捉语音信号的特征,而成为音频信号处理中的一个重要组成部分。
傅里叶变换
傅里叶变换是一种将时域信号转换为频域信号的数学工具,它可以将任何周期性或非周期性的时间序列信号表示成不同频率的正弦波和余弦波的叠加。傅里叶变换在信号处理、图像处理、通信系统等多个领域都有着广泛的应用。通过傅里叶变换,可以分析信号的频率成分、频谱特性和频谱分布,进而实现信号的滤波、降噪、压缩等处理。
色度特征(Chroma特征)
色度特征(Chroma features)是音频信号处理中的一种特征提取方法,它表示音频信号中的音高信息,可以用于识别音乐中的和声、旋律和音调。色度特征通常与其他特征(如MFCC、零交叉率、能量、谱滚降点、谱通量和谱熵)结合使用,以提高音频处理任务的性能。色度特征的计算通常涉及将频谱映射到12个色度区间(代表12个半音),然后计算每个区间的能量。
梅尔频率倒谱系数(MFCCs)特征
梅尔频率倒谱系数(MFCC)是一种用于声音信号处理的特征参数,广泛应用于语音识别、情感分析和音乐分类等领域。它通过对声音信号进行预加重、分帧、滤波器组处理、梅尔滤波器分析和离散余弦变换(DCT)等一系列操作,将复杂的波形信号转化为一系列紧凑的特征向量,这些特征向量能够捕捉到人耳对声音感知的关键特性。
实战
导入相关库文件
import numpy as np
import pandas as pd
import os
import librosa
import matplotlib.pyplot as plt
import seaborn as sns
from tqdm.notebook import tqdm
import IPython
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from imblearn.over_sampling import RandomOverSampler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation,Reshape,MaxPooling2D, Dropout, Conv2D, MaxPool2D, Flatten
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import EarlyStopping
这段代码是用于音频分类任务的Python脚本,它导入了一些必要的库和模块:
-
import numpy as np
:导入NumPy库,用于进行高效的数值计算。 -
import pandas as pd
:导入Pandas库,用于数据处理和分析。 -
import os
:导入OS库,用于处理文件和目录操作。 -
import librosa
:导入Librosa库,用于音频处理和分析。 -
import matplotlib.pyplot as plt
:导入Matplotlib库,用于绘制图形和可视化数据。 -
import seaborn as sns
:导入Seaborn库,基于Matplotlib,提供了一种高级接口来绘制有吸引力且信息丰富的统计图形。 -
from tqdm.notebook import tqdm
:导入tqdm库的notebook版本,用于显示进度条。 -
import IPython
:导入IPython库,用于交互式计算和创建富交互式环境(如Jupyter Notebook)。 -
from sklearn.model_selection import train_test_split
:从scikit-learn库中导入train_test_split函数,用于将数据集划分为训练集和测试集。 -
from sklearn.preprocessing import LabelEncoder
:从scikit-learn库中导入LabelEncoder类,用于对类别标签进行编码。 -
from imblearn.over_sampling import RandomOverSampler
:从imblearn库中导入RandomOverSampler类,用于通过随机过采样处理不平衡数据集。 -
from tensorflow.keras.models import Sequential
:从TensorFlow Keras库中导入Sequential模型,用于构建神经网络。 -
from tensorflow.keras.layers import Dense, Activation, Reshape, MaxPooling2D, Dropout, Conv2D, MaxPool2D, Flatten
:从TensorFlow Keras库中导入各种层,用于构建卷积神经网络(CNN)。 -
from tensorflow.keras.utils import to_categorical
:从TensorFlow Keras库中导入to_categorical函数,用于将整数目标转换为分类编码。 -
from tensorflow.keras.callbacks import EarlyStopping
:从TensorFlow Keras库中导入EarlyStopping回调,用于在训练过程中提前停止模型训练,以防止过拟合。
加载数据
import os
paths = []
labels = []
root_dir = 'AUDIO'
for subdir in os.listdir(root_dir):
subdir_path = os.path.join(root_dir, subdir)
if os.path.isdir(subdir_path):
for filename in os.listdir(subdir_path):
file_path = os.path.join(subdir_path, filename)
paths.append(file_path)
labels.append(subdir)
print('Dataset is loaded')
这段代码的目的是从一个根目录(root_dir
)中加载音频文件及其对应的标签:
- 定义一个空列表
paths
,用于存储所有音频文件的路径。 - 定义一个空列表
labels
,用于存储与音频文件对应的标签。 - 定义根目录
root_dir
,在这个例子中,它是Kaggle上的一个音频数据集。 - 使用
for
循环遍历根目录下的所有子目录(subdir
)。 - 对于每个子目录,将其路径与子目录名连接起来,得到子目录的完整路径(
subdir_path
)。 - 检查当前路径是否是一个目录(
os.path.isdir(subdir_path)
),如果是,则继续执行以下步骤:- 使用另一个
for
循环遍历子目录中的所有文件(filename
)。 - 将子目录路径与文件名连接起来,得到文件的完整路径(
file_path
),并将其添加到paths
列表中。 - 根据子目录名称添加相应的标签到
labels
列表中。
- 使用另一个
- 当所有文件和标签都被加载后,打印一条消息表示数据集已加载。
最终,paths
列表包含了所有音频文件的路径,而labels
列表包含了与这些文件对应的标签。这些信息可以用于后续的数据处理和模型训练。
数据集划分
然后将收集到的音频做好划分
我们也可以播放音频
因为我写本文的时候是截图的,所以其实听不到音频
可视化
我们也可以将其可视化
real_ad, real_sr = librosa.load(real_audio)
plt.figure(figsize= (12,4))
plt.plot(real_ad)
plt.title('Real Audio Data')
plt.show()
这段代码使用Librosa库加载一个名为real_audio
的音频文件,并绘制其波形图:
-
real_ad, real_sr = librosa.load(real_audio)
:使用Librosa库的load
函数加载名为real_audio
的音频文件。load
函数返回两个值:音频数据(real_ad
)和采样率(real_sr
)。请注意,需要在运行此代码之前定义
real_audio
变量,使其指向音频文件的路径。例如:real_audio = 'path/to/your/audio/file.wav'
-
plt.figure(figsize=(12, 4))
:使用Matplotlib库创建一个新的图形,并设置其尺寸为12x4英寸。 -
plt.plot(real_ad)
:使用Matplotlib库的plot
函数绘制音频数据的波形图。 -
plt.title('Real Audio Data')
:为图形设置标题“Real Audio Data”。 -
plt.show()
:显示绘制的图形。
运行此代码后将看到一个窗口,其中包含名为“Real Audio Data”的标题和音频数据的波形图。这有助于直观地了解音频数据的结构和特征。
执行后如下所示
也可以换种可视化方法
real_spec = np.abs(librosa.stft(real_ad))
real_spec = librosa.amplitude_to_db(real_spec, ref = np.max)
plt.figure(figsize=(14,5))
librosa.display.specshow(real_spec, sr = real_sr, x_axis = 'time', y_axis = 'log')
plt.colorbar(format = '%+2.0f dB')
plt.title("Real Audio Spectogram")
plt.show()
这段代码使用Librosa库从音频信号中提取频谱特征,并将频谱图以分贝为单位显示出来:
-
real_spec = np.abs(librosa.stft(real_ad))
:使用Librosa库的stft
函数计算音频信号的短时傅里叶变换(STFT)。stft
函数返回复数频谱,我们取其实部(幅度谱)存储在real_spec
中。请注意,您需要在运行此代码之前定义
real_ad
变量,使其指向音频数据的路径。例如:real_ad, real_sr = librosa.load(real_audio)
-
real_spec = librosa.amplitude_to_db(real_spec, ref=np.max)
:使用Librosa库的amplitude_to_db
函数将幅度谱转换为分贝值。这里使用最大幅度作为参考值(ref=np.max
)。 -
plt.figure(figsize=(14, 5))
:使用Matplotlib库创建一个新的图形,并设置其尺寸为14x5英寸。 -
librosa.display.specshow(real_spec, sr=real_sr, x_axis='time', y_axis='log')
:使用Librosa库的specshow
函数显示音频的频谱图。设置采样率为real_sr
,x轴为时间(x_axis='time'
),y轴为对数频率(y_axis='log'
)。 -
plt.colorbar(format='%+2.0f dB')
:在频谱图上添加一个颜色条,显示分贝值,格式为%+2.0f dB
。 -
plt.title("Real Audio Spectrogram")
:为图形设置标题“Real Audio Spectrogram”。 -
plt.show()
:显示绘制的图形。
运行此代码后将看到一个窗口,其中包含名为“Real Audio Spectrogram”的标题和音频数据的频谱图。这有助于直观地了解音频数据的频域特征。
执行后如下所示
再换一种
real_mel_spect = librosa.feature.melspectrogram(y = real_ad, sr = real_sr)
real_mel_spect = librosa.power_to_db(real_mel_spect, ref = np.max)
plt.figure(figsize = (14,5))
librosa.display.specshow(real_mel_spect, y_axis ='mel', x_axis = 'time')
plt.title('Real Audio Mel Spectogram')
plt.colorbar(format = '%+2.0f dB')
plt.show()
这段代码使用Librosa库从音频信号中提取梅尔频谱特征,并将梅尔频谱图以分贝为单位显示出来:
-
real_mel_spect = librosa.feature.melspectrogram(y=real_ad, sr=real_sr)
:使用Librosa库的melspectrogram
函数计算音频信号的梅尔频谱。输入参数为音频信号(y=real_ad
)和采样率(sr=real_sr
)。请注意,您需要在运行此代码之前定义
real_ad
和real_sr
变量,使其指向音频数据的路径和采样率。例如:real_ad, real_sr = librosa.load(real_audio)
-
real_mel_spect = librosa.power_to_db(real_mel_spect, ref=np.max)
:使用Librosa库的power_to_db
函数将梅尔频谱的功率值转换为分贝值。这里使用最大功率作为参考值(ref=np.max
)。 -
plt.figure(figsize=(14, 5))
:使用Matplotlib库创建一个新的图形,并设置其尺寸为14x5英寸。 -
librosa.display.specshow(real_mel_spect, y_axis='mel', x_axis='time')
:使用Librosa库的specshow
函数显示音频的梅尔频谱图。设置y轴为梅尔频率(y_axis='mel'
),x轴为时间(x_axis='time'
)。 -
plt.title('Real Audio Mel Spectrogram')
:为图形设置标题“Real Audio Mel Spectrogram”。 -
plt.colorbar(format='%+2.0f dB')
:在梅尔频谱图上添加一个颜色条,显示分贝值,格式为%+2.0f dB
。 -
plt.show()
:显示绘制的图形。
运行此代码后,将看到一个窗口,其中包含名为“Real Audio Mel Spectrogram”的标题和音频数据的梅尔频谱图。这有助于直观地了解音频数据的梅尔频域特征。
执行后如下所示
再换一种
real_chroma = librosa.feature.chroma_cqt(y = real_ad, sr = real_sr, bins_per_octave=36)
plt.figure(figsize = (14, 5))
librosa.display.specshow(real_chroma, sr = real_sr, x_axis = 'time', y_axis = 'chroma', vmin = 0, vmax = 1)
plt.colorbar()
plt.title('Real Audio Chormagram')
plt.show()
这段代码使用Librosa库从音频信号中提取色度特征(Chroma特征),并显示色度图:
-
real_chroma = librosa.feature.chroma_cqt(y=real_ad, sr=real_sr, bins_per_octave=36)
:使用Librosa库的chroma_cqt
函数计算音频信号的色度特征。输入参数为音频信号(y=real_ad
)、采样率(sr=real_sr
)以及每个八度的bin数(bins_per_octave=36
)。请注意,您需要在运行此代码之前定义
real_ad
和real_sr
变量,使其指向音频数据的路径和采样率。例如:real_ad, real_sr = librosa.load(real_audio)
-
plt.figure(figsize=(14, 5))
:使用Matplotlib库创建一个新的图形,并设置其尺寸为14x5英寸。 -
librosa.display.specshow(real_chroma, sr=real_sr, x_axis='time', y_axis='chroma', vmin=0, vmax=1)
:使用Librosa库的specshow
函数显示音频的色度图。设置采样率为real_sr
,x轴为时间(x_axis='time'
),y轴为色度(y_axis='chroma'
),并设置颜色范围的最小值为0,最大值为1(vmin=0, vmax=1
)。 -
plt.colorbar()
:在色度图上添加一个颜色条。 -
plt.title('Real Audio Chormagram')
:为图形设置标题“Real Audio Chormagram”。 -
plt.show()
:显示绘制的图形。
运行此代码后,将看到一个窗口,其中包含名为“Real Audio Chormagram”的标题和音频数据的色度图。这有助于直观地了解音频数据的色度特征。
执行后如下所示
再换一种
real_mfcc = librosa.feature.mfcc(y = real_ad, sr = real_sr)
plt.figure(figsize = (14,5))
librosa.display.specshow(real_mfcc, sr = real_sr, x_axis ='time')
plt.colorbar()
plt.title('Real Audio Mel-Frequency Cepstral Ceofficients (MFCCS)')
plt.show()
这段代码使用Librosa库从音频信号中提取梅尔频率倒谱系数(MFCCs)特征,并显示MFCCs图:
-
real_mfcc = librosa.feature.mfcc(y=real_ad, sr=real_sr)
:使用Librosa库的mfcc
函数计算音频信号的梅尔频率倒谱系数(MFCCs)。输入参数为音频信号(y=real_ad
)和采样率(sr=real_sr
)。请注意,您需要在运行此代码之前定义
real_ad
和real_sr
变量,使其指向音频数据的路径和采样率。例如:real_ad, real_sr = librosa.load(real_audio)
-
plt.figure(figsize=(14, 5))
:使用Matplotlib库创建一个新的图形,并设置其尺寸为14x5英寸。 -
librosa.display.specshow(real_mfcc, sr=real_sr, x_axis='time')
:使用Librosa库的specshow
函数显示音频的MFCCs图。设置采样率为real_sr
,x轴为时间(x_axis='time'
)。 -
plt.colorbar()
:在MFCCs图上添加一个颜色条。 -
plt.title('Real Audio Mel-Frequency Cepstral Coefficients (MFCCs)')
:为图形设置标题“Real Audio Mel-Frequency Cepstral Coefficients (MFCCs)”。 -
plt.show()
:显示绘制的图形。
运行此代码后,将看到一个窗口,其中包含名为“Real Audio Mel-Frequency Cepstral Coefficients (MFCCs)”的标题和音频数据的MFCCs图。这有助于直观地了解音频数据的MFCCs特征。
执行后如下所示
现在再来看看伪造音频对应的可视化结果
数据特征探索
我们也可以看看其他特征
比如我们分别查看真伪音频的分布差异
warnings.filterwarnings("ignore", category=FutureWarning, module="seaborn")
for column in X:
plt.figure(figsize=(10, 3))
sns.histplot(audio_data[audio_data['LABEL'] == 0][column], kde=True, label='Fake', color='blue')
sns.histplot(audio_data[audio_data['LABEL'] == 1][column], kde=True, label='Real', color='orange')
plt.title(f'Distribution of {column}')
plt.legend()
plt.show()
这段代码的目的是为了可视化不同特征(列)在真实(Real)和伪造(Fake)音频数据之间的分布差异。它使用了Seaborn库来创建直方图,并通过Matplotlib库显示这些图表:
-
warnings.filterwarnings("ignore", category=FutureWarning, module="seaborn")
:这行代码用于忽略Seaborn库产生的特定警告信息,这些警告通常与未来版本的不兼容性有关。 -
for column in X:
:这个循环遍历了特征矩阵X
中的每一列,即每一个特征。 -
plt.figure(figsize=(10, 3))
:为每个特征的分布图创建一个新的图形窗口,并设置其尺寸为10x3英寸。 -
sns.histplot(audio_data[audio_data['LABEL'] == 0][column], kde=True, label='Fake', color='blue')
:使用Seaborn库的histplot
函数绘制标签为0(即伪造音频)的数据点在当前特征上的直方图。kde=True
表示同时绘制核密度估计。label='Fake'
和color='blue'
分别设置了图例标签和线条颜色。 -
sns.histplot(audio_data[audio_data['LABEL'] == 1][column], kde=True, label='Real', color='orange')
:同样使用histplot
函数绘制标签为1(即真实音频)的数据点在当前特征上的直方图。label='Real'
和color='orange'
分别设置了图例标签和线条颜色。 -
plt.title(f'Distribution of {column}')
:为当前特征的分布图设置标题。 -
plt.legend()
:在图表上添加图例,以区分真实和伪造音频的分布。 -
plt.show()
:显示当前特征的分布图。
请注意,为了运行这段代码,需要确保audio_data
是一个Pandas DataFrame,其中包含了特征列和一个名为'LABEL'
的列,该列包含了每个音频样本的标签(0代表伪造,1代表真实)。此外,X
应该是一个包含特征列名的列表或者是一个特征矩阵。
或者我们也可以查看相关系数矩阵
import seaborn as sns
correlation_matrix = audio_data.corr()
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, cmap='coolwarm')
plt.title('Correlation Matrix')
plt.show()
这段代码的目的是计算并可视化audio_data
DataFrame中各个特征之间的相关系数矩阵。以下是代码的详细解释:
-
import seaborn as sns
:导入Seaborn库,这是一个基于Matplotlib的数据可视化库,用于创建具有吸引力的统计图形。 -
correlation_matrix = audio_data.corr()
:使用Pandas DataFrame的corr()
方法计算所有特征之间的相关系数矩阵。相关系数的值介于-1和1之间,其中1表示完全正相关,-1表示完全负相关,0表示无相关性。 -
plt.figure(figsize=(10, 8))
:使用Matplotlib创建一个新的图形窗口,并设置其尺寸为10x8英寸。 -
sns.heatmap(correlation_matrix, cmap='coolwarm')
:使用Seaborn的heatmap
函数绘制相关系数矩阵的热图。cmap='coolwarm'
设置颜色映射,其中正相关显示为红色,负相关显示为蓝色。 -
plt.title('Correlation Matrix')
:为热图设置标题。 -
plt.show()
:显示相关系数矩阵的热图。
这段代码将帮助理解特征之间的相互关系,从而指导特征选择或模型优化过程。
执行之后得到的矩阵如下所示
预处理
现在我们需要对数据做预处理
from tqdm import tqdm
import numpy as np
import os
import librosa
def extract_features(audio_path, max_length=500):
features = []
labels = []
for folder in os.listdir(audio_path):
folder_path = os.path.join(audio_path, folder)
for file in tqdm(os.listdir(folder_path)):
file_path = os.path.join(folder_path, file)
try:
audio, _ = librosa.load(file_path, sr=16000)
mfccs = librosa.feature.mfcc(y=audio, sr=16000, n_mfcc=40)
if mfccs.shape[1] < max_length:
mfccs = np.pad(mfccs, ((0, 0), (0, max_length - mfccs.shape[1])), mode='constant')
else:
mfccs = mfccs[:, :max_length]
features.append(mfccs)
if folder == 'FAKE':
labels.append(1) # 1 for fake
else:
labels.append(0) # 0 for real
except Exception as e:
print(f"Error encountered while parsing file: {file_path}")
continue
return np.array(features), np.array(labels)
audio_path = 'AUDIO'
x, y = extract_features(audio_path)
print("Features shape:", x.shape)
print("Labels shape:", y.shape)
这段代码定义了一个名为extract_features
的函数,用于从给定路径的音频文件中提取特征。在这个例子中,提取的特征是梅尔频率倒谱系数(MFCCs):
-
导入所需的库:
tqdm
用于显示进度条,numpy
用于进行数值计算,os
用于处理文件和目录操作,librosa
用于音频处理。 -
定义
extract_features
函数,接受两个参数:audio_path
(音频文件的根目录)和max_length
(特征数组的最大长度,默认为500)。 -
在函数内部,定义两个空列表
features
和labels
,用于存储提取的特征和对应的标签。 -
使用
for
循环遍历audio_path
下的所有子目录(folder
)。 -
对于每个子目录,使用另一个
for
循环遍历其中的所有文件(file
)。使用tqdm
显示进度条。 -
对于每个文件,尝试执行以下操作:
- 使用
librosa.load
函数加载音频文件,设置采样率为16000 Hz。 - 使用
librosa.feature.mfcc
函数提取音频的梅尔频率倒谱系数(MFCCs),设置MFCC数量为40。 - 根据
max_length
参数,对MFCCs数组进行填充或裁剪,使其具有固定长度。 - 将处理后的MFCCs数组添加到
features
列表中。 - 根据子目录名称分配标签。如果子目录名称为
FAKE
,则标签为1(表示假音频);否则,标签为0(表示真音频)。
- 使用
-
如果在处理文件时遇到异常,打印错误消息并继续处理下一个文件。
-
函数返回提取的特征数组(
features
)和对应的标签数组(labels
)。 -
示例用法:调用
extract_features
函数,传入音频文件的根目录。然后打印特征数组和标签数组的形状。
这一块执行会比较费时间
执行完毕后如下所示
定义网络
现在我们定义一个简单的卷积神经网络
这段代码定义了一个简单的卷积神经网络(CNN)模型,用于音频分类任务:
-
Sequential
:创建一个顺序模型,用于堆叠多个层。 -
Reshape((40, 500, 1), input_shape=xtrain.shape[1:])
:将输入数据重塑为一个具有形状(40, 500, 1)的张量。input_shape
参数指定输入数据的形状,这里假设xtrain
是已经提取好的特征数据。 -
Conv2D(32, kernel_size=(3, 3), activation='relu')
:添加一个卷积层,使用32个卷积核,核大小为3x3,激活函数为ReLU。 -
MaxPooling2D(pool_size=(2, 2))
:添加一个最大池化层,池化大小为2x2。 -
Conv2D(64, kernel_size=(3, 3), activation='relu')
:添加另一个卷积层,使用64个卷积核,核大小为3x3,激活函数为ReLU。 -
MaxPooling2D(pool_size=(2, 2))
:添加另一个最大池化层,池化大小为2x2。 -
Flatten()
:添加一个展平层,将卷积层的输出展平为一维张量。 -
Dense(128, activation='relu')
:添加一个全连接层,包含128个神经元,激活函数为ReLU。 -
Dropout(0.5)
:添加一个Dropout层,丢弃率为0.5,以减少过拟合。 -
Dense(1, activation='sigmoid')
:添加一个输出层,包含1个神经元,激活函数为Sigmoid。这适用于二分类任务,输出概率值。
这个CNN模型适用于音频分类任务,特别是当输入特征具有类似图像的结构时(例如,梅尔频谱图或MFCCs)。
然后开始训练
训练中截图如下
测试
训练完毕后进行测试
可以看到准确率达到71%
LSTM
我们也可以考虑用LSTM来检测真伪音频
设计LSTM模型
model = Sequential()
model.add(LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True))
model.add(LSTM(64))
model.add(Dense(64, activation = 'relu'))
model.add(Dropout(0.3))
model.add(Dense(32 , activation = 'relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation = 'sigmoid'))
optimizer = optimizers.Adam(learning_rate=0.0001)
model.compile(optimizer=optimizer, loss = BinaryCrossentropy(), metrics=['accuracy'])
model.summary()
这段代码定义了一个使用长短时记忆(LSTM)网络的深度学习模型,用于处理序列数据,如音频数据的时间序列:
-
model = Sequential()
:创建一个顺序模型,用于堆叠多个层。 -
model.add(LSTM(64, input_shape=(X_train.shape[1], X_train.shape[2]), return_sequences=True))
:添加第一个LSTM层,它有64个单元,并指定输入数据的形状。input_shape
参数应该匹配你的输入数据(例如,经过预处理的音频特征)。return_sequences=True
表示该LSTM层将返回每个输入序列的隐藏状态,这对于堆叠多个LSTM层是必要的。 -
model.add(LSTM(64))
:添加第二个LSTM层,它也有64个单元。由于没有指定return_sequences
,默认情况下它将返回最后一个时间步的隐藏状态,这对于紧接着的全连接层是合适的。 -
model.add(Dense(64, activation='relu'))
:添加一个全连接层(Dense层),包含64个神经元,并使用ReLU激活函数。 -
model.add(Dropout(0.3))
:添加一个Dropout层,以减少过拟合。Dropout比例为30%。 -
model.add(Dense(32, activation='relu'))
:添加另一个全连接层,包含32个神经元,并使用ReLU激活函数。 -
model.add(Dropout(0.5))
:再次添加一个Dropout层,Dropout比例为50%。 -
model.add(Dense(1, activation='sigmoid'))
:添加输出层,包含一个神经元,并使用Sigmoid激活函数。这适用于二分类任务,输出概率值。 -
optimizer = optimizers.Adam(learning_rate=0.0001)
:定义优化器,这里使用Adam优化器,并设置学习率为0.0001。 -
model.compile(optimizer=optimizer, loss=BinaryCrossentropy(), metrics=['accuracy'])
:编译模型,指定优化器、损失函数和评估指标。这里使用二元交叉熵(BinaryCrossentropy)作为损失函数,准确率(accuracy)作为评估指标。 -
model.summary()
:打印模型的摘要,显示模型的架构和参数数量。
执行后如下所示
然后进行训练
画出训练过程中的准确率变换曲线
查看测试准确率
可以看到准确率达到了98%
参考
1.https://saturncloud.io/blog/a-comprehensive-guide-to-convolutional-neural-networks-the-eli5-way/
3.https://medium.com/@palashm0002/understanding-and-implementing-lstm-networks-41ca52495108
5.https://en.wikipedia.org/wiki/Audio_deepfake
6.https://blog.csdn.net/zzc15806/article/details/79246716
7.https://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E5%82%85%E9%87%8C%E5%8F%B6%E5%8F%98%E6%8D%A2
1