File size: 4,827 Bytes
1d8403e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# ==================================================================================================
# DEEPFAKE AUDIO - vocoder/display.py (Console Monitoring Engine)
# ==================================================================================================
# 
# πŸ“ DESCRIPTION
# This module provides styling and progress visualization for the vocoder 
# training and generation processes. It includes progress bars, formatted 
# tables, and Matplotlib routines for saving attention maps and spectrograms 
# during model checkpoints.
#
# πŸ‘€ AUTHORS
# - Amey Thakur (https://github.com/Amey-Thakur)
# - Mega Satish (https://github.com/msatmod)
#
# 🀝🏻 CREDITS
# Original Real-Time Voice Cloning methodology by CorentinJ
# Repository: https://github.com/CorentinJ/Real-Time-Voice-Cloning
#
# πŸ”— PROJECT LINKS
# Repository: https://github.com/Amey-Thakur/DEEPFAKE-AUDIO
# Video Demo: https://youtu.be/i3wnBcbHDbs
# Research: https://github.com/Amey-Thakur/DEEPFAKE-AUDIO/blob/main/DEEPFAKE-AUDIO.ipynb
#
# πŸ“œ LICENSE
# Released under the MIT License
# Release Date: 2021-02-06
# ==================================================================================================

import time
import numpy as np
import sys

def progbar(i, n, size=16):
    """Diagnostic UI: Renders a character-based progress bar for console feedback."""
    done = (i * size) // n
    bar = ''
    for i in range(size):
        bar += 'β–ˆ' if i <= done else 'β–‘'
    return bar

def stream(message):
    """Dynamic Output: Overwrites the current console line for live status updates."""
    try:
        sys.stdout.write("\r{%s}" % message)
    except:
        # Fallback: Cleanse non-ASCII characters to prevent encoding errors
        message = ''.join(i for i in message if ord(i)<128)
        sys.stdout.write("\r{%s}" % message)

def simple_table(item_tuples):
    """Information Grid: Prints a structured ASCII table for model parameters or stats."""
    border_pattern = '+---------------------------------------'
    whitespace = '                                            '
    headings, cells, = [], []

    for item in item_tuples:
        heading, cell = str(item[0]), str(item[1])
        pad_head = True if len(heading) < len(cell) else False
        pad = whitespace[:abs(len(heading) - len(cell))]
        pad_left = pad[:len(pad)//2]
        pad_right = pad[len(pad)//2:]

        if pad_head:
            heading = pad_left + heading + pad_right
        else:
            cell = pad_left + cell + pad_right

        headings += [heading]
        cells += [cell]

    border, head, body = '', '', ''
    for i in range(len(item_tuples)):
        temp_head = f'| {headings[i]} '
        temp_body = f'| {cells[i]} '
        border += border_pattern[:len(temp_head)]
        head += temp_head
        body += temp_body

        if i == len(item_tuples) - 1:
            head += '|'
            body += '|'
            border += '+'

    print(f"{border}\n{head}\n{border}\n{body}\n{border}\n ")

def time_since(started):
    """Temporal Tracker: Formats elapsed time into a human-readable string."""
    elapsed = time.time() - started
    m = int(elapsed // 60)
    s = int(elapsed % 60)
    if m >= 60:
        h = int(m // 60)
        m = m % 60
        return f'{h}h {m}m {s}s'
    else:
        return f'{m}m {s}s'

def save_attention(attn, path):
    """Attentive Visualizer: Generates and saves a PNG representation of attention maps."""
    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(12, 6))
    plt.imshow(attn.T, interpolation='nearest', aspect='auto')
    fig.savefig(f'{path}.png', bbox_inches='tight')
    plt.close(fig)

def save_spectrogram(M, path, length=None):
    """Signal Visualizer: Persists Mel-Spectrogram snapshots to the filesystem."""
    import matplotlib.pyplot as plt
    M = np.flip(M, axis=0)
    if length: M = M[:, :length]
    fig = plt.figure(figsize=(12, 6))
    plt.imshow(M, interpolation='nearest', aspect='auto')
    fig.savefig(f'{path}.png', bbox_inches='tight')
    plt.close(fig)

def plot(array):
    """Signal Debugger: Generates a large-scale plot for 1D signal exploration."""
    import matplotlib.pyplot as plt
    fig = plt.figure(figsize=(30, 5))
    ax = fig.add_subplot(111)
    ax.xaxis.label.set_color('grey')
    ax.yaxis.label.set_color('grey')
    ax.xaxis.label.set_fontsize(23)
    ax.yaxis.label.set_fontsize(23)
    ax.tick_params(axis='x', colors='grey', labelsize=23)
    ax.tick_params(axis='y', colors='grey', labelsize=23)
    plt.plot(array)

def plot_spec(M):
    """Interactive Visualizer: Displays a spectrogram using standard pyplot routing."""
    import matplotlib.pyplot as plt
    M = np.flip(M, axis=0)
    plt.figure(figsize=(18,4))
    plt.imshow(M, interpolation='nearest', aspect='auto')
    plt.show()