Skip to content

Commit dd10815

Browse files
committed
Restructure audiobot, update main for faster startup
Signed-off-by: Skye <[email protected]>
1 parent 57ee83f commit dd10815

File tree

16 files changed

+142
-119
lines changed

16 files changed

+142
-119
lines changed

audiobot/__init__.py

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
"""
2+
///////] /// /// ///////] (O) //////] ///// //////] /////////
3+
// // /// /// // // /// /// /// // / /// /// ///
4+
///////// /// /// // / /// /// /// ///// /// /// ///
5+
// // /// /// // / /// // // // / // // ///
6+
// // ////////// /////// / /// /////// /////// /////// ///
27
Perform audio modifications such as adding voice effect to an audio or video file\n
38
<b>Operation</b>:
49
<ul>
@@ -15,9 +20,27 @@
1520
</ul>
1621
"""
1722

18-
from .cli import Argsmain as main
19-
23+
from .cli import cli, ArgumentsProcessor
24+
from .utils.logging_utils import LoggingFormatter, colored_logger
25+
from .utils.visualizer import audiowave_visualizer
26+
from .utils.metadata_utils import get_audio_bitrate
27+
from .core.codec import AudioSegmentArrayCodec
28+
from .core.effects import VoiceEffectProcessor
29+
from .core.audio.core import AudioModulator, AudioDenoiser
2030

31+
__version__ = "0.2.0"
32+
__all__ = [
33+
"cli",
34+
"ArgumentsProcessor",
35+
"LoggingFormatter",
36+
"colored_logger",
37+
"audiowave_visualizer",
38+
"get_audio_bitrate",
39+
"AudioSegmentArrayCodec",
40+
"VoiceEffectProcessor",
41+
"AudioModulator",
42+
"AudioDenoiser",
43+
]
2144
LOGO = """
2245
///////] /// /// ///////] (O) //////] ///// //////] /////////
2346
// // /// /// // // /// /// /// // / /// /// ///

audiobot/cli.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
#!/usr/bin/python3
2+
3+
4+
"""
5+
CLI Entry point for audiobot.\n
6+
<b>Implements</b>:\n
7+
Argsmain->cmd argument handler either from other packages or directly form cli
8+
"""
9+
210
import argparse
311
import logging
412

@@ -7,16 +15,16 @@
715
import magic
816
from .utils.metadata_utils import transcribe_audio
917
from filemac.utils.colors import fg, rs
10-
from .processor import VideoProcessor, AudioProcessor
11-
from .logging_config import setup_colored_logger
12-
from .config import Config
18+
from .core.processor import VideoProcessor, AudioProcessor
19+
from .utils.logging_utils import colored_logger
20+
from .config.core import Config
1321

1422
RESET = rs
1523

16-
Clogger = setup_colored_logger()
24+
Clogger = colored_logger()
1725

1826

19-
class Processor:
27+
class ArgumentsProcessor:
2028
def __init__(self, args, parser):
2129
self.args = args
2230
self.parser = parser
@@ -98,7 +106,7 @@ def batch_processor(self):
98106
Clogger.info(e)
99107

100108

101-
def Argsmain(argsv=None):
109+
def cli(argsv=None):
102110
"""
103111
Recieve and process agruments from audio/video audio effects
104112
"""
@@ -181,8 +189,8 @@ def Argsmain(argsv=None):
181189
config.options["cutoff"] = args.cutoff
182190
config.options["noise"] = args.noise
183191
# Call argument processor
184-
Processor(args, parser).process()
192+
ArgumentsProcessor(args, parser).process()
185193

186194

187195
if __name__ == "__main__":
188-
Argsmain()
196+
cli()

audiobot/config/__init__.py

Whitespace-only changes.
File renamed without changes.

audiobot/core/__init__.py

Whitespace-only changes.

audiobot/modulator.py renamed to audiobot/core/audio/core.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import numpy as np
2-
from .logging_config import setup_colored_logger
2+
from ...utils.logging_utils import colored_logger
33
import librosa
44
from pydub import AudioSegment, effects
55
from scipy.signal import butter, lfilter, sosfilt
6-
from .config import Config
6+
from ...config.core import Config
77
from filemac.utils.colors import fg, rs
88

99
RESET = rs
1010

11-
Clogger = setup_colored_logger()
11+
Clogger = colored_logger()
1212
config = Config()
1313

1414

15-
class Modulator:
15+
class AudioModulator:
1616
def __init__(self):
1717
self._cutoff = config.options.get("cutoff")
1818

@@ -172,7 +172,7 @@ def normalize(self, audio_segment):
172172
return effects.normalize(audio_segment)
173173

174174

175-
class Denoiser:
175+
class AudioDenoiser:
176176
def __init__(self, sample_rate=44100):
177177
self.sample_rate = sample_rate
178178
# Dictionaries to cache filter coefficients by cutoff value
File renamed without changes.

audiobot/effects.py renamed to audiobot/core/effects.py

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from pydub import effects
22
from .codec import AudioSegmentArrayCodec
3-
from .modulator import Modulator
4-
from .logging_config import setup_colored_logger
3+
from .audio.core import AudioModulator
4+
from ..utils.logging_utils import colored_logger
55
from pydub import AudioSegment
66

7-
# logger = setup_colored_logger()
7+
# logger = colored_logger()
88

99

1010
class VoiceEffectProcessor:
@@ -13,42 +13,42 @@ def __init__(self, audio_segment, effect: str, verbosity: bool = False):
1313
self.audio_segment = audio_segment
1414
self.verbosity = verbosity
1515
self.handler = AudioSegmentArrayCodec()
16-
self.logger = setup_colored_logger()
16+
self.logger = colored_logger()
1717

1818
def _apply_chipmunk(self):
19-
return Modulator().pitch_shift(
19+
return AudioModulator().pitch_shift(
2020
effects.speedup(self.audio_segment, 1.01), n_steps=9
2121
)
2222

2323
def _apply_high(self):
24-
return Modulator().pitch_shift(self.audio_segment, n_steps=4)
24+
return AudioModulator().pitch_shift(self.audio_segment, n_steps=4)
2525

2626
def _apply_lowpass(self):
27-
return Modulator().lowpass(self.audio_segment)
27+
return AudioModulator().lowpass(self.audio_segment)
2828

2929
def _apply_highpass(self):
30-
return Modulator().highpass(self.audio_segment)
30+
return AudioModulator().highpass(self.audio_segment)
3131

3232
def _apply_robotic(self):
33-
return Modulator().pitch_shift(
33+
return AudioModulator().pitch_shift(
3434
effects.speedup(self.audio_segment, 1.01), n_steps=-10
3535
)
3636

3737
def _apply_demonic(self):
3838
return (
39-
Modulator()
39+
AudioModulator()
4040
.pitch_shift(effects.speedup(self.audio_segment, 1.01), n_steps=-10)
4141
.overlay(
4242
AudioSegment.silent(duration=700) + self.audio_segment.fade_out(500)
4343
)
4444
)
4545

4646
def _apply_hacker(self):
47-
return Modulator().hacker(self.audio_segment)
47+
return AudioModulator().hacker(self.audio_segment)
4848

4949
def _apply_distortion(self):
5050
samples, sample_rate = self.handler.audiosegment_to_numpy(self.audio_segment)
51-
distorted_samples = Modulator().distort(samples)
51+
distorted_samples = AudioModulator().distort(samples)
5252
return self.handler.numpy_to_audiosegment(
5353
distorted_samples,
5454
sample_rate,
@@ -57,18 +57,18 @@ def _apply_distortion(self):
5757
)
5858

5959
def _apply_deep(self):
60-
return Modulator().pitch_shift(self.audio_segment, n_steps=-4)
60+
return AudioModulator().pitch_shift(self.audio_segment, n_steps=-4)
6161

6262
def _apply_echo(self):
6363
delay = AudioSegment.silent(duration=1000)
6464
return self.audio_segment.overlay(delay + self.audio_segment)
6565

6666
def _apply_whisper(self):
67-
return Modulator().whisper(self.audio_segment)
67+
return AudioModulator().whisper(self.audio_segment)
6868

6969
def _apply_reverb(self):
7070
samples, sample_rate = self.handler.audiosegment_to_numpy(self.audio_segment)
71-
reverbed_samples = Modulator().reverb(samples)
71+
reverbed_samples = AudioModulator().reverb(samples)
7272
return self.handler.numpy_to_audiosegment(
7373
reverbed_samples,
7474
sample_rate,
@@ -77,10 +77,10 @@ def _apply_reverb(self):
7777
)
7878

7979
def denoise(self):
80-
from .modulator import Denoiser
80+
from .modulator import AudioDenoiser
8181

8282
sample, sample_rate = self.handler.audiosegment_to_numpy(self.audio_segment)
83-
denoised_sample = Denoiser().denoise(sample)
83+
denoised_sample = AudioDenoiser().denoise(sample)
8484
audio_segment = self.handler.numpy_to_audiosegment(
8585
denoised_sample,
8686
sample_rate,

audiobot/processor.py renamed to audiobot/core/processor.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
import os
2-
from .modulator import Modulator
2+
from .audio.core import AudioModulator
33
from moviepy import AudioFileClip, VideoFileClip
4-
from .logging_config import setup_colored_logger
4+
from ..utils.logging_utils import colored_logger
55
from pydub import AudioSegment
6-
from .utils.visualizer import visualize_audio_wave
7-
from .utils.metadata_utils import get_bitrate
6+
from ..utils.visualizer import audiowave_visualizer
7+
from ..utils.metadata_utils import get_audio_bitrate
88
from .effects import VoiceEffectProcessor
99
from filemac.utils.colors import fg, rs
1010
import sys
11-
import io
11+
# import io
1212

1313
RESET = rs
1414

15-
Clogger = setup_colored_logger()
15+
Clogger = colored_logger()
1616

1717

1818
class VideoProcessor:
@@ -36,7 +36,7 @@ def process_video_file(
3636

3737
try:
3838
# Get the original video bitrate
39-
original_bitrate = get_bitrate(input_file, verbosity)
39+
original_bitrate = get_audio_bitrate(input_file, verbosity)
4040
if verbosity and original_bitrate:
4141
Clogger.info(
4242
f"Original video bitrate: {fg.YELLOW_FG}{original_bitrate}{RESET}"
@@ -45,8 +45,8 @@ def process_video_file(
4545
# Capture stdout and stderr
4646
old_stdout = sys.stdout
4747
old_stderr = sys.stderr
48-
sys.stdout = captured_stdout = io.StringIO()
49-
sys.stderr = captured_stderr = io.StringIO()
48+
# sys.stdout = captured_stdout = io.StringIO()
49+
# sys.stderr = captured_stderr = io.StringIO()
5050

5151
# Load the video
5252
try:
@@ -69,7 +69,7 @@ def process_video_file(
6969
modified_audio = VoiceEffectProcessor(audio_segment, effect).apply_effect()
7070

7171
# Normalize the modified audio
72-
modified_audio = Modulator().normalize(modified_audio)
72+
modified_audio = AudioModulator().normalize(modified_audio)
7373

7474
# Export the modified audio to a WAV file
7575
if verbosity:
@@ -105,10 +105,10 @@ def process_video_file(
105105
)
106106

107107
Clogger.info(f"Modified video saved as: {output_file}")
108-
Clogger.debug(f"Final bitrate = {get_bitrate(output_file)}")
108+
Clogger.debug(f"Final bitrate = {get_audio_bitrate(output_file)}")
109109
# Optional: visualize the before and after audio
110110
if visualize:
111-
visualize_audio_wave(audio_file, "modified_audio.wav")
111+
audiowave_visualizer(audio_file, "modified_audio.wav")
112112

113113
# Clean up temporary files
114114
if os.path.exists(audio_file):
@@ -140,15 +140,15 @@ def process_audio_file(
140140
print(f"- INFO - Audio channels: {audio_segment.channels}")
141141
print(f"- INFO - Audio sample width: {audio_segment.sample_width}")
142142
modified_audio = VoiceEffectProcessor(audio_segment, effect).apply_effect()
143-
modified_audio = Modulator().normalize(modified_audio)
143+
modified_audio = AudioModulator().normalize(modified_audio)
144144
output_file = os.path.join(
145145
output_dir, f"{effect}_{os.path.basename(input_file)}"
146146
)
147147
modified_audio.export(output_file, format="wav")
148148
Clogger.info(f"Modified audio saved as: {output_file}")
149149

150150
if visualize:
151-
visualize_audio_wave(input_file, output_file)
151+
audiowave_visualizer(input_file, output_file)
152152

153153
except Exception as e:
154154
Clogger.error(f"Error processing audio file {input_file}: {e}")

audiobot/logging_config.py renamed to audiobot/utils/logging_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
RESET = rs
55

66

7-
class CustomFormatter(logging.Formatter):
7+
class LoggingFormatter(logging.Formatter):
88
COLORS = {
99
logging.DEBUG: fg.BBLUE_FG,
1010
logging.INFO: fg.GREEN_FG,
@@ -19,7 +19,7 @@ def format(self, record):
1919
return f"{log_color}{log_message}{RESET}"
2020

2121

22-
def setup_colored_logger(logger_name="colored_logger") -> logging.Logger:
22+
def colored_logger(logger_name="colored_logger") -> logging.Logger:
2323
"""
2424
Sets up a colored logger with a single handler.
2525
@@ -30,7 +30,7 @@ def setup_colored_logger(logger_name="colored_logger") -> logging.Logger:
3030

3131
if not logger.handlers: # Check if handlers already exist
3232
handler = logging.StreamHandler()
33-
handler.setFormatter(CustomFormatter("- %(levelname)s - %(message)s"))
33+
handler.setFormatter(LoggingFormatter("- %(levelname)s - %(message)s"))
3434
logger.addHandler(handler)
3535
logger.setLevel(logging.INFO)
3636

0 commit comments

Comments
 (0)