收藏关注不迷路!!

🌟文末获取源码+数据库🌟

感兴趣的可以先收藏起来,还有大家在毕设选题(免费咨询指导选题),项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人


一、项目介绍

基于TensorFlow卷积神经网络(CNN)的声纹识别系统是一种先进的身份认证技术,它通过分析语音信号中的声纹特征来识别说话人的身份。以下是对该系统的详细介绍:

一、系统概述
声纹识别,又称说话人识别,利用了每个人独特的语音特征,如声调、音质、语速等。随着人工智能和深度学习技术的飞速发展,声纹识别技术已广泛应用于身份认证、语音助手、智能家居等领域。基于TensorFlow框架和CNN技术构建的声纹识别系统,旨在提高识别的准确性和鲁棒性。

二、功能介绍

该系统主要包括以下几个部分:

数据准备:收集包含多个说话人语音的数据集,并进行标注。数据集应包括说话人的身份信息、语音内容等。同时,对语音数据进行必要的预处理操作,如降噪、分帧等。
模型构建:使用TensorFlow框架构建CNN模型。模型应包含多个卷积层、池化层和全连接层,以提取语音信号中的深层次特征并进行分类。
模型训练:将预处理后的语音数据输入到CNN模型中进行训练。在训练过程中,可以使用适当的损失函数和优化算法,如交叉熵损失函数和Adam优化算法,对模型进行优化。同时,可以采用数据增强技术,如音频变速、变调等,提高模型的泛化能力。
模型评估与调优:使用独立的测试数据集对训练好的模型进行评估,计算模型的准确率、召回率等指标。根据评估结果对模型进行调优,如调整模型结构、参数等,以提高模型的性能。
系统集成与部署:将训练好的CNN模型集成到一个完整的声纹识别系统中,包括语音输入模块、模型推理模块和结果输出模块等。系统应支持实时语音输入和识别,并能够将识别结果以可视化或文本形式输出给用户。

三、核心代码

部分代码:

import argparse
import functools
import shutil
import numpy as np
import tensorflow as tf
import os
import librosa.display
import matplotlib.pyplot as plt
import qdarkstyle
from utils.reader import load_audio
from utils.record import RecordAudio
from utils.utility import add_arguments, print_arguments
from PySide2.QtWidgets import QApplication, QInputDialog, QLineEdit, QFileDialog, QMainWindow
from PySide2.QtUiTools import QUiLoader
from PySide2.QtGui import QIcon

parser = argparse.ArgumentParser(description=__doc__)
add_arg = functools.partial(add_arguments, argparser=parser)
add_arg('audio_db', str, 'audio_db', '音频库的路径')
add_arg('input_shape', str, '(257, 257, 1)', '数据输入的形状')
add_arg('threshold', float, 0.7, '判断是否为同一个人的阈值')
add_arg('model_path', str, 'models/infer_model.h5', '预测模型的路径')
args = parser.parse_args()

print_arguments(args)

# 加载模型
model = tf.keras.models.load_model(args.model_path)
model = tf.keras.models.Model(inputs=model.input, outputs=model.get_layer('batch_normalization').output)

# 获取均值和标准值
input_shape = eval(args.input_shape)

# 打印模型
model.build(input_shape=input_shape)
model.summary()

person_feature = []
person_name = []


# 预测音频
def infer(audio_path):
    data = load_audio(audio_path, mode='infer', spec_len=input_shape[1])
    data = data[np.newaxis, :]  # 形成一个张量
    feature = model.predict(data)
    return feature


# 加载要识别的音频库
def load_audio_db(audio_db_path):
    audios = os.listdir(audio_db_path)
    for audio in audios:
        path = os.path.join(audio_db_path, audio)
        name = audio[:-4]
        feature = infer(path)[0]
        person_name.append(name)
        person_feature.append(feature)
        print("Loaded %s audio." % name)


# 声纹识别
def recognition(path):
    name = ''
    pro = 0
    feature = infer(path)[0]
    for i, person_f in enumerate(person_feature):
        dist = np.dot(feature, person_f) / (np.linalg.norm(feature) * np.linalg.norm(person_f))  # 值越接近1说明两个向量夹角越接近于0
        if dist > pro:
            pro = dist
            name = person_name[i]
    return name, pro


def judge(path, name_user):
    pro = 0
    feature = infer(path)[0]
    for i, person_f in enumerate(person_feature):
        if person_name[i] == name_user:
            pro = np.dot(feature, person_f) / (np.linalg.norm(feature) * np.linalg.norm(person_f))  # 值越接近1说明两个向量夹角越接近于0
    return pro


# 声纹注册
def register(path, user_name):
    save_path = os.path.join(args.audio_db, user_name + os.path.basename(path)[-4:])
    shutil.move(path, save_path)
    feature = infer(save_path)[0]
    person_name.append(user_name)
    person_feature.append(feature)


load_audio_db(args.audio_db)
record_audio = RecordAudio()


# 声纹频域特征
def audio_feature_frequency(audio_path, name):
    y, sr = librosa.load(str(audio_path), sr=16000)
    D = np.abs(librosa.stft(y)) ** 2
    S = librosa.feature.melspectrogram(S=D)
    plt.figure(figsize=(10, 4))
    librosa.display.specshow(librosa.power_to_db(S, ref=np.max), y_axis='mel', fmax=8000, x_axis='time')
    plt.colorbar(format='%+2.0f dB')
    plt.title('Mel spectrogram')
    plt.tight_layout()
    if name == 'temp':
        plt.show()
    else:
        plt.savefig('audio_feature_frequency/{}.png'.format(name))
        plt.close()


# 声纹时域特征
def audio_feature_time(audio_path, name):
    y, sr = librosa.load(str(audio_path), sr=16000)
    plt.figure(figsize=(10, 4))
    librosa.display.waveshow(y, sr=16000, color='red')
    plt.title('audio_wave')
    plt.xlim(0, 2)
    if name == 'temp':
        plt.show()
    else:
        plt.savefig('audio_feature_time/{}.png'.format(name))
        plt.close()


def handle_frequency():
    directory = QFileDialog.getOpenFileName(QMainWindow(), "频域特征列表", "audio_feature_frequency")
    plt.figure(figsize=(10, 6))
    im = plt.imread(directory[0])
    plt.imshow(im)
    plt.axis('off')
    plt.show()


def handle_time():
    directory = QFileDialog.getOpenFileName(QMainWindow(), "时域特征列表", "audio_feature_time")
    plt.figure(figsize=(10, 6))
    im = plt.imread(directory[0])
    plt.imshow(im)
    plt.axis('off')
    plt.show()


class Voice:

    def __init__(self):

        self.ui = QUiLoader().load('GUI/gui_1.ui')
        self.ui.button_start.clicked.connect(self.handle_start)
        self.ui.button_true_or_fake.clicked.connect(self.handle_true_or_fake)
        self.ui.button_remove.clicked.connect(self.handle_remove)
        self.ui.button_register.clicked.connect(self.handle_register)
        self.ui.button_remove_result.clicked.connect(self.handle_remove_result)
        self.ui.button_time.clicked.connect(handle_time)
        self.ui.button_frequency.clicked.connect(handle_frequency)
        self.wavelib = os.listdir('audio_db')
        for k in range(len(self.wavelib)):
            self.ui.textBrowser_2.append(str(self.wavelib[k]))

    def handle_remove(self):
        self.ui.textBrowser_2.clear()
        shutil.rmtree('audio_db')
        os.mkdir('audio_db')
        shutil.rmtree('audio_feature_frequency')
        os.mkdir('audio_feature_frequency')
        shutil.rmtree('audio_feature_time')
        os.mkdir('audio_feature_time')

    def handle_remove_result(self):
        self.ui.textBrowser.clear()

    def handle_register(self):
        audio_path = record_audio.record(self.ui)
        name, ok = QInputDialog.getText(self.ui, 'Text Input Dialog', '请输入该音频用户的名称:', QLineEdit.Normal)
        register(audio_path, name)
        audio_feature_frequency('audio_db/{}.wav'.format(name), name)
        audio_feature_time('audio_db/{}.wav'.format(name), name)
        self.ui.textBrowser_2.append(name)

    def handle_start(self):
        audio_path = record_audio.record(self.ui)
        name, p = recognition(audio_path)
        audio_feature_frequency('audio/temp.wav', 'temp')
        audio_feature_time('audio/temp.wav', 'temp')
        if p > args.threshold:
            self.ui.textBrowser.append("识别说话的为:%s,相似度为:%f" % (name, p))
            self.ui.textBrowser.ensureCursorVisible()
        else:
            self.ui.textBrowser.append("音频库没有该用户的语音")
            self.ui.textBrowser.ensureCursorVisible()

    def handle_true_or_fake(self):
        audio_path = record_audio.record(self.ui)
        name, ok = QInputDialog.getText(self.ui, 'Text Input Dialog', '你是谁?', QLineEdit.Normal)
        p = judge(audio_path, name)
        audio_feature_frequency('audio/temp.wav', 'temp')
        audio_feature_time('audio/temp.wav', 'temp')
        if p > 0:
            if p > args.threshold:
                self.ui.textBrowser.append("你是%s,相似度为:%f" % (name, p))
                self.ui.textBrowser.ensureCursorVisible()
            else:
                self.ui.textBrowser.append("你不是%s,相似度为:%f" % (name, p))
                self.ui.textBrowser.ensureCursorVisible()
        else:
            self.ui.textBrowser.append("注册库里没有您的名字" )
            self.ui.textBrowser.ensureCursorVisible()


app = QApplication([])
stats = Voice()
app.setWindowIcon(QIcon('logo.ico'))
app.setStyleSheet(qdarkstyle.load_stylesheet_pyside2())
stats.ui.show()
app.exec_()





四、效果图

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

五、文章目录

目 录
1 绪 论 1
1.1 选题的背景 1
1.2 国内外研究现状 1
1.3 选题的目的和意义 1
1.4主要研究内容 3
2 相关技术介绍 5
2.1 卷积神经网络 5
2.2 系统开发相关技术 9
3 数据获取及预处理 14
3.1 数据集的获取及简介 14
3.2 数据预处理 17
4 模型训练与评估 18
4.1 模型选择 14
3.2 模型训练 17
4.3 模型评估 17
5 模型优化 18
5.1 优化器选择 14
5.2 效果对比分析 17
6 系统部署 19
6.1 需求分析 14
6.2 系统设计与实现 17
6.3 系统测试 17
7 总结与展望 29
7.1 总结 29
7.2 展望 29
参考文献 30
致 谢 33

六 、源码获取

下方名片联系我即可!!


大家点赞、收藏、关注、评论啦 、查看👇🏻获取联系方式👇🏻

更多推荐