File size: 2,144 Bytes
3883c60
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import shlex
import subprocess
import tempfile
import traceback
from typing import Any

import PIL
import gradio
import numpy as np
import scipy.io.wavfile
from gradio import processing_utils, utils
from gradio_client.client import DEFAULT_TEMP_DIR
from matplotlib import pyplot as plt

import setup_tools.os
from webui.args import args
from webui.ui.tabs import settings


def showwaves(
        audio: str | tuple[int, np.ndarray]
):
    try:
        if isinstance(audio, str):
            audio_file = audio
            audio = processing_utils.audio_from_file(audio)
        else:
            tmp_wav = tempfile.NamedTemporaryFile(dir=DEFAULT_TEMP_DIR, suffix=".wav", delete=False)
            processing_utils.audio_to_file(audio[0], audio[1], tmp_wav.name, format="wav")
            audio_file = tmp_wav.name

        output_mp4 = tempfile.NamedTemporaryFile(dir=DEFAULT_TEMP_DIR, suffix=".mkv", delete=False)

        command = f'ffmpeg -y -i {audio_file} -filter_complex "[0:a]showwaves=s=1280x720:mode=line,format=yuv420p[v]" -map "[v]" -map 0:a -preset veryfast -c:v libx264 -c:a copy {output_mp4.name}'

        if not setup_tools.os.is_windows():
            command = shlex.split(command)

        run = subprocess.run(command)
        return output_mp4.name if run.returncode == 0 else None
    except Exception as e:
        traceback.print_exception(e)
        return None


def make_waveform(
    audio: str | tuple[int, np.ndarray],
    *,
    bg_color: str = "#f3f4f6",
    bg_image: str | None = None,
    fg_alpha: float = 1.00,  # (was 0.75)
    bars_color: str | tuple[str, str] = ("#65B5FF", "#1B76FF"),  # (was ("#fbbf24", "#ea580c"))
    bar_count: int = 50,
    bar_width: float = 0.6,
    wav_type: str = None
):
    if wav_type is None:
        wav_type = settings.get('wav_type').casefold()
    match wav_type:
        case 'showwaves':
            return showwaves(audio)
        case 'gradio':
            return gradio.make_waveform(audio, bg_color=bg_color, bg_image=bg_image, fg_alpha=fg_alpha, bars_color=bars_color, bar_count=bar_count, bar_width=bar_width)
        case 'none' | _:
            return None