Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions audio_processing.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
"""Module for audio processing operations."""

from typing import Tuple

import numpy as np
import soundfile as sf


def read_audio(path: str) -> Tuple[np.ndarray, int]:
"""Read audio file and return data with samplerate."""
data, samplerate = sf.read(path)
return data, samplerate


def write_audio(path: str, data: np.ndarray, samplerate: int) -> None:
"""Write audio data to file."""
sf.write(path, data, samplerate)


def reverse_audio(data: np.ndarray) -> np.ndarray:
"""Return reversed audio signal."""
return data[::-1]
46 changes: 46 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""Main module for Lab 3 Variant 21."""

import argparse
import os

from audio_processing import read_audio, reverse_audio, write_audio
from visualization import plot_audio


def main() -> None:
"""CLI entry point."""
parser = argparse.ArgumentParser(description="Lab 3 Variant 21")
parser.add_argument("--input_path", required=True, type=str)
parser.add_argument("--output_path", required=True, type=str)

args = parser.parse_args()

if not os.path.exists(args.input_path):
print("Файл не найден.")
return

try:
data, samplerate = read_audio(args.input_path)
except Exception:
print("Ошибка чтения аудиофайла.")
return

print("Размер массива:", data.shape)
print("Частота дискретизации:", samplerate)
print("Длительность (сек):", len(data) / samplerate)

reversed_data = reverse_audio(data)

plot_audio(data, reversed_data, samplerate)

try:
write_audio(args.output_path, reversed_data, samplerate)
except Exception:
print("Ошибка записи файла.")
return

print("Файл сохранён:", args.output_path)


if __name__ == "__main__":
main()
35 changes: 35 additions & 0 deletions visualization.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""Module for audio visualization."""

import matplotlib.pyplot as plt
import numpy as np


def plot_audio(
original: np.ndarray,
reversed_audio: np.ndarray,
samplerate: int
) -> None:
"""Plot original and reversed audio signals."""
time_original = np.linspace(
0, len(original) / samplerate, num=len(original)
)
time_reversed = np.linspace(
0, len(reversed_audio) / samplerate, num=len(reversed_audio)
)

plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(time_original, original)
plt.title("Original Audio")
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude")

plt.subplot(2, 1, 2)
plt.plot(time_reversed, reversed_audio)
plt.title("Reversed Audio")
plt.xlabel("Time (seconds)")
plt.ylabel("Amplitude")

plt.tight_layout()
plt.show()