-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestMicro_PC.py
More file actions
168 lines (138 loc) · 6.07 KB
/
testMicro_PC.py
File metadata and controls
168 lines (138 loc) · 6.07 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
"""
Тест записи с микрофона для ПК!
"""
import os
import pyaudio
import wave
from kivy.lang import Builder
from kivymd.app import MDApp
from kivymd.uix.button import MDRoundFlatButton
from kivy.clock import Clock
from kivy.core.audio import SoundLoader
from threading import Event
class AudioRecorder:
def __init__(self):
self.audio = None
self.frames = []
self.stream = None
self.file_path = "myrecording.wav"
self.audio_gate = Event() # Синхронизация доступа
self.audio_gate.set() # Разрешаем доступ сразу
def reset_audio(self):
"""Останавливает старые соединения и очищает данные перед началом новой записи."""
if self.stream is not None:
self.stream.stop_stream()
self.stream.close()
if self.audio is not None:
self.audio.terminate()
# Очищаем старые данные
self.frames = []
self.audio = pyaudio.PyAudio()
# Удаляем старый файл записи, если он существует
if os.path.exists(self.file_path):
try:
os.remove(self.file_path)
print(f"Удален старый файл: {self.file_path}")
except Exception as e:
print(f"Не удалось удалить файл: {e}")
def start_recording(self):
"""Начинает запись с нуля, сбрасывая все старые данные и соединения"""
self.reset_audio() # Сброс старых данных и потоков
self.audio_gate.wait() # Блокируем доступ, если запись/воспроизведение идет
self.audio_gate.clear() # Блокируем другие потоки
try:
self.stream = self.audio.open(
format=pyaudio.paInt16,
channels=1,
rate=44100,
input=True,
frames_per_buffer=1024
)
# Планируем чтение аудио
Clock.schedule_interval(self.record_chunk, 0) # 0 - записываем бесконечно
print("Запись началась.")
except IOError as e:
print(f"Ошибка при открытии потока: {e}")
def stop_recording(self):
"""Останавливает запись и сохраняет файл"""
Clock.unschedule(self.record_chunk) # Прекращаем запись
if self.stream is not None:
self.stream.stop_stream()
self.stream.close()
self.audio.terminate()
# Сохраняем аудиофайл
try:
sound_file = wave.open(self.file_path, "wb")
sound_file.setnchannels(1)
sound_file.setsampwidth(self.audio.get_sample_size(pyaudio.paInt16))
sound_file.setframerate(44100)
sound_file.writeframes(b''.join(self.frames))
sound_file.close()
print(f"Запись сохранена в файл {self.file_path}")
except Exception as e:
print(f"Ошибка при сохранении файла: {e}")
self.audio_gate.set() # Разрешаем доступ для других операций
def play_audio(self):
"""Прослушиваем записанный файл"""
# Загружаем новый звук (обновляем объект SoundLoader)
self.sound = SoundLoader.load(self.file_path)
if self.sound:
# Если звук загружен, воспроизводим
self.sound.play()
print("Проигрывание записи началось.")
else:
print("Не удалось загрузить звук для воспроизведения.")
def record_chunk(self, dt):
"""Читает данные с потока и добавляет в список"""
data = self.stream.read(1024)
self.frames.append(data)
class AudioApp(MDApp):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.file_path = "myrecording.wav"
self.is_recording = False
self.recorder = AudioRecorder()
self.sound = None
def build(self):
return Builder.load_string(
'''
MDScreen:
MDRoundFlatButton:
id: record_button
text: "Начать запись"
size_hint: .2, .1
pos_hint: {"center_x": 0.5, "center_y": 0.7}
on_release: app.toggle_recording()
MDRoundFlatButton:
id: play_button
text: "Прослушать запись"
size_hint: .2, .1
pos_hint: {"center_x": 0.5, "center_y": 0.3}
on_release: app.play_audio()
'''
)
def toggle_recording(self):
button = self.root.ids.record_button
if self.is_recording:
self.is_recording = False
button.text = "Начать запись"
# Останавливаем запись
self.recorder.stop_recording()
else:
self.is_recording = True
button.text = "Остановить запись"
# Начинаем запись
self.recorder.start_recording()
def play_audio(self):
"""Прослушиваем записанный файл"""
# Загружаем новый звук (обновляем объект SoundLoader)
self.sound = SoundLoader.load(self.file_path)
if self.sound:
# Если звук загружен, воспроизводим
self.sound.play()
print("Проигрывание записи началось.")
else:
print("Не удалось загрузить звук для воспроизведения.")
# Запуск приложения
if __name__ == "__main__":
AudioApp().run()