新年第一文 | Lip synching detective(假唱侦探工具包)

Lipsynchingdetective是一个用Python开发的可视化工具,具有GUI界面,用于检测歌曲是否为假唱。它通过上传歌曲和MIDI文件,解析MIDI,分析歌曲音频,然后比较频率信息来判断。工具包包括上传、解析、分析和比较功能,以及详细的使用说明和源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Lip synching detective

注意:工具包尚未完成,许多功能还未得到实现,希望大家积极地参与到项目中来!

1.工具包简介

Lip synching detective 是由Python语言开发的、一个可视化的、有GUI界面的声音分析工具包,主要用于判断歌曲是否是假唱。

2. 工具包功能

Lip synching detective具有以下功能:

上传歌曲文件和MIDI乐谱文件
对歌曲文件进行声音分析
对MIDI乐谱进行解析
判断歌曲是否是假唱

3. 工具包界面

界面包括以下部分:

  1. 标题栏
  2. 菜单栏
  3. 上传文件区域
  4. 分析结果显示区域
  5. 状态栏

4. 工具包工作流程

Lip synching detective的工作流程如下图所示:


Created with Raphaël 2.3.0 Start Upload song and MIDI file Parse MIDI file Analyze song Compare song and MIDI file Display result End

5. 工具包实现

Lip synching detective的实现包括以下几个部分:

  • 上传文件功能:

Lip synching detective通过GUI界面提供的文件上传按钮,允许用户上传歌曲文件和MIDI乐谱文件。

  • MIDI文件解析功能:

Lip synching detective使用MIDI解析库解析MIDI乐谱文件,并提取出每个音符的频率和时间信息。

  • 歌曲声音分析功能:

Lip synching detective使用声音分析库分析歌曲文件,并提取出每个时间点的频率信息。

  • 歌曲假唱判断功能:

Lip synching detective通过比较歌曲文件中人声部分的频率信息和MIDI乐谱中的音符频率信息,判断歌曲是否是假唱。

6. 工具包文件结构

Lip synching detective的文件结构如下:

Lip-synching-detective/
├── main.py
├── upload_files.py
├── parse_midi.py
├── analyze_song.py
├── compare.py
├── GUI.py
├── README.md

7. 工具包使用说明

使用Lip synching detective的说明如下:

  1. 安装依赖:Lip synching detective 需要MIDI解析库、声音分析库和GUI库的支持。请确保已安装这些库。

  2. 在本地搭建 Lip synching detective 工具包:本工具包中有许多不完善的。

  3. 运行Lip synching detective:在终端中进入Lip synching detective的根目录,输入以下命令运行Lip synching detective:

python main.py
  1. 上传文件:在GUI界面中点击“上传歌曲文件”和“上传MIDI乐谱文件”按钮,选择需要分析的歌曲文件和MIDI乐谱文件。

  2. 开始分析:点击“开始分析”按钮,Lip synching detective开始分析歌曲文件和MIDI乐谱文件。

  3. 查看结果:在GUI界面的“分析结果”区域中查看分析结果。如果分析结果为“假唱”,则表示歌曲中存在假唱;如果分析结果为“真唱”,则表示歌曲中没有假唱。

8. 工具包源代码

以下是Lip synching detective的源代码展示:

main.py

import GUI
import analyze_song
import compare
import parse_midi

def main():
    # Display GUI
    GUI.display()

    # Prompt user to select song and MIDI files
    song_file = GUI.prompt_for_file('song')
    midi_file = GUI.prompt_for_file('MIDI')

    # Analyze song and MIDI files
    song_frequencies = analyze_song.analyze(song_file)
    midi_notes = parse_midi.parse(midi_file)

    # Compare song and MIDI data to determine if lip syncing
    result = compare.compare(song_frequencies, midi_notes)

    # Display result in GUI
    GUI.display_result(result)

if __name__ == '__main__':
    main()

upload_files.py

def upload():
    # Prompt user to upload song and MIDI file
    song_file = input('Please upload your song file: ')
    midi_file = input('Please upload your MIDI file: ')

    return song_file, midi_file

parse_midi.py

def parse(midi_file):
    # Use MIDI parsing library to parse MIDI file and extract notes
    midi_notes = []
    for note in midi_file:
        midi_notes.append((note.frequency, note.start_time, note.end_time))

    return midi_notes
    

analyze_song.py

def analyze(song_file):
    # Use sound analysis library to analyze song and extract frequencies at each time point
    song_frequencies = []
    for time_point in song_file:
        song_frequencies.append(time_point.frequency)

    return song_frequencies
    

compare.py

def compare(song_frequencies, midi_notes):
    # Compare song frequencies and MIDI notes to determine if song is lip syncing
    for i, frequency in enumerate(song_frequencies):
        if frequency != midi_notes[i][0]:
            return 'Lip syncing'

    return 'Not lip syncing'

GUI.py

import tkinter as tk

class LipSynchingDetectiveGUI:
    def __init__(self, master):
        self.master = master
        self.master.title('Lip synching detective')

        # Create menu bar
        self.menu_bar = tk.Menu(self.master)
        self.master.config(menu=self.menu_bar)

        # Create file menu
        self.file_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.menu_bar.add_cascade(label='File', menu=self.file_menu)
        self.file_menu.add_command(label='Upload song', command=self.upload_song)
        self.file_menu.add_command(label='Upload MIDI', command=self.upload_midi)
        self.file_menu.add_separator()
        self.file_menu.add_command(label='Exit', command=self.master.quit)

        # Create help menu
        self.help_menu = tk.Menu(self.menu_bar, tearoff=0)
        self.menu_bar.add_cascade(label='Help', menu=self.help_menu)
        self.help_menu.add_command(label='Instructions', command=self.display_instructions)
        self.help_menu.add_separator()
        self.help_menu.add_command(label='About', command=self.display_about)

        # Create upload files frame
        self.upload_frame = tk.Frame(self.master)
        self.upload_frame.pack(side='top', fill='both', expand=True)

        # Create song upload button
        self.song_button = tk.Button(self.upload_frame, text='Upload song', command=self.upload_song)
        self.song_button.pack(side='left')

        # Create MIDI upload button
        self.midi_button = tk.Button(self.upload_frame, text='Upload MIDI', command=self.upload_midi)
        self.midi_button.pack(side='left')

        # Create analyze button
        self.analyze_button = tk.Button(self.upload_frame, text='Analyze', command=self.analyze)
        self.analyze_button.pack(side='left')

        # Create result display frame
        self.result_frame = tk.Frame(self.master)
        self.result_frame.pack(side='top', fill='both', expand=True)

        # Create result label
        self.result_label = tk.Label(self.result_frame, text='Result:')
        self.result_label.pack(side='left')

        # Create result display
        self.result_display = tk.Label(self.result_frame, text='N/A')
        self.result_display.pack(side='left')

        # Create status bar
        self.status_bar = tk.Label(self.master, text='Ready', bd=1, relief='sunken', anchor='w')
        self.status_bar.pack(side='bottom', fill='x')

    def upload_song(self):
        # Prompt user to select song file
        song_file = tk.filedialog.askopenfilename()
        self.status_bar.config(text='Song file: ' + song_file)

    def upload_midi(self):
        # Prompt user to select MIDI file
        midi_file = tk.filedialog.askopenfilename()
        self.status_bar.config(text='MIDI file: ' + midi_file)

    def analyze(self):
    	# Parse MIDI file
    	midi_notes = parse_midi.parse(self.midi_file)

    	# Analyze song
    	song_frequencies = analyze_song.analyze(self.song_file)

    	# Compare song and MIDI file
    	result = compare.compare(song_frequencies, midi_notes)

    	# Display result
    	self.result_display.config(text=result)


    def display_instructions(self):
    	tk.messagebox.showinfo('Instructions', '1. Click "Upload song" to select the song file you want to analyze.\n2. Click "Upload MIDI" to select the MIDI file corresponding to the song.\n3. Click "Analyze" to start the analysis.\n4. The result will be displayed in the "Result" area.')


    def display_about(self):
    	tk.messagebox.showinfo('About Lip synching detective', 'Lip synching detective is a tool for detecting lip syncing in songs. It compares the frequencies of a song with those in a MIDI file to determine if the song is lip syncing.')


def main():
    root = tk.Tk()
    app = LipSynchingDetectiveGUI(root)
    root.mainloop()

if __name__ == '__main__':
    main()

9. 源码地址

  1. Gitcode镜像地址:https://gitcode.net/weixin_41102528/Lip-synching-detective
  2. Github地址:https://github.com/Mr-liuzhenming/Lip-synching-detective
  3. Gitee镜像地址:https://gitee.com/technologylzm/Lip-synching-detective
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

[root@小刘较瘦~]#

打赏即动力,打赏即鼓励。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值