-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathclass_of_changes.py
More file actions
257 lines (195 loc) · 10.1 KB
/
class_of_changes.py
File metadata and controls
257 lines (195 loc) · 10.1 KB
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
from abc import ABC
import numpy as np
from audio_effects import speed_down
from librosa.effects import pitch_shift
from pydub import AudioSegment
from pydub.effects import speedup
from sound_interface import SoundManager
class ChangeOfVolume(SoundManager):
"""Класс для изменения громкости аудиофайла.
Атрибуты:
delta_volume (float): Величина изменения громкости в децибелах.
modified_song (AudioSegment): Модифицированная версия аудиофайла.
"""
def __init__(self, delta: float) -> None:
"""Инициализирует объект изменения громкости.
Аргументы:
delta (float): Величина изменения громкости в децибелах.
"""
self.delta_volume = delta
self.modified_song = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Применяет изменение громкости к аудиофайлу.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл с измененной громкостью.
"""
self.modified_song = song + self.delta_volume
return self.modified_song
def change_slider(self) -> bool:
'''Возвращает смену слайдеров'''
return True
class ChangeOfSpeed(SoundManager):
"""Класс для изменения скорости воспроизведения аудиофайла.
Атрибуты:
song (AudioSegment): Исходный аудиофайл.
delta_speed (float): Коэффициент изменения скорости.
modified (AudioSegment): Модифицированная версия аудиофайла.
"""
def __init__(self, speed: float) -> None:
"""Инициализирует объект изменения скорости.
Аргументы:
speed (float): Коэффициент изменения скорости (1.0 - оригинальная скорость).
"""
self.song = None
self.delta_speed = speed
self.modified = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Применяет изменение скорости к аудиофайлу.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл с измененной скоростью.
"""
self.song = song
if self.delta_speed < 1:
self.modified = speed_down(song, self.delta_speed, 150, 25)
elif self.delta_speed > 1:
self.modified = speedup(song, self.delta_speed, 150, 25)
else:
self.modified = self.song
return self.modified
def change_slider(self) -> bool:
'''Возвращает смену слайдера'''
return True
class Reverse(SoundManager, ABC):
"""Класс для обратного воспроизведения аудиофайла.
Атрибуты:
modified_song (AudioSegment): Обратная версия аудиофайла.
"""
def __init__(self) -> None:
"""Инициализирует объект обратного воспроизведения."""
self.modified_song = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Создает обратную версию аудиофайла.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл с обратным воспроизведением.
"""
self.modified_song = song.reverse()
return self.modified_song
def change_slider(self) -> bool:
'''Возвращает изменения слайдера'''
return False
class GlueFragments(SoundManager, ABC):
"""Класс для склейки двух аудиофрагментов.
Атрибуты:
first (AudioSegment): Первый аудиофрагмент.
second (AudioSegment): Второй аудиофрагмент.
modify (AudioSegment): Результат склейки фрагментов.
"""
def __init__(self, first_fragment: AudioSegment, second_fragment: AudioSegment) -> None:
"""Инициализирует объект склейки фрагментов.
Аргументы:
first_fragment (AudioSegment): Первый фрагмент для склейки.
second_fragment (AudioSegment): Второй фрагмент для склейки.
"""
self.first = first_fragment
self.second = second_fragment
self.modify = None
def execute(self) -> AudioSegment:
"""Выполняет склейку двух фрагментов.
Возвращает:
AudioSegment: Результат склейки двух фрагментов.
"""
self.modify = self.first + self.second
return self.modify
def change_slider(self) -> bool:
'''Возвращает изменения слайдера'''
return False
class CutOutFragment(SoundManager):
"""Класс для вырезания фрагмента из аудиофайла.
Атрибуты:
result (AudioSegment): Результат после вырезания фрагмента.
first_index (int): Начальный индекс вырезаемого фрагмента (в миллисекундах).
second_index (int): Конечный индекс вырезаемого фрагмента (в миллисекундах).
song (AudioSegment): Исходный аудиофайл.
"""
def __init__(self, first_index: int, second_index: int) -> None:
"""Инициализирует объект вырезания фрагмента.
Аргументы:
first_index (int): Начальный индекс вырезаемого фрагмента.
second_index (int): Конечный индекс вырезаемого фрагмента.
"""
self.result = None
self.first_index = first_index
self.second_index = second_index
self.song = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Выполняет вырезание указанного фрагмента.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл без вырезанного фрагмента.
"""
fragment_one = song[: self.first_index]
fragment_two = song[self.second_index :]
self.result = fragment_one + fragment_two
self.song = song
return self.result
def change_slider(self) -> bool:
'''Возвращает смену слайдера'''
return True
class ChangeOfSampleRate(SoundManager):
"""Класс для изменения частоты воспроизведения аудиофайла.
Атрибуты:
song (AudioSegment): Исходный аудиофайл.
delta_speed (float): Коэффициент изменения частоты.
modified (AudioSegment): Модифицированная версия аудиофайла.
"""
def __init__(self, sample_rate: int) -> None:
"""Инициализирует объект изменения частоты.
Аргументы:
sample_rate (int): Коэффициент изменения частоты (44100 - базовая частота).
"""
self.song = None
self.delta_sample_rate = sample_rate
self.modified = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Применяет изменение частоты к аудиофайлу.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл с измененной частотой.
"""
self.modified = song.set_frame_rate(self.delta_sample_rate)
return self.modified
def change_slider(self) -> bool:
'''Возвращает смену слайдера'''
return True
class ChangeOfOctave(SoundManager):
"""Класс для изменения высоты воспроизведения аудиофайла.
Атрибуты:
song (AudioSegment): Исходный аудиофайл.
delta_speed (float): Коэффициент изменения высоты.
modified (AudioSegment): Модифицированная версия аудиофайла.
"""
def __init__(self, octave: float) -> None:
self.delta_octave = octave
self.modified = None
def execute(self, song: AudioSegment) -> AudioSegment:
"""Применяет изменение высоты к аудиофайлу.
Аргументы:
song (AudioSegment): Исходный аудиофайл для обработки.
Возвращает:
AudioSegment: Аудиофайл с измененной высотой.
"""
new_sample = np.array(song.get_array_of_samples()).astype(np.float32)
new_song = pitch_shift(new_sample, sr=song.frame_rate, n_steps=self.delta_octave * 12.0)
self.modified = song._spawn(new_song.astype(np.int16).tobytes())
return self.modified
def change_slider(self) -> bool:
'''Возвращает смену слайдера'''
return True