import argparse import datetime import os import sys try: import sounddevice as sd import numpy as np from scipy.io.wavfile import write except ImportError: print("오류: sounddevice, numpy, scipy 패키지가 필요합니다.") print("uv pip install sounddevice numpy scipy 를 실행해주세요.") sys.exit(1) def list_devices(): """시스템에 연결된 오디오 입력 디바이스의 목록을 출력합니다.""" print("=== 시스템 오디오 디바이스 목록 ===") print(sd.query_devices()) print("================================") print("녹음에 사용할 입력 디바이스의 인덱스 번호를 확인하세요.") def record_audio(device_index, duration=None, samplerate=16000): """ 지정된 디바이스 인덱스에서 오디오를 캡처하여 WAV 파일로 저장합니다. 디바이스는 주로 USB 사운드카드 (Line-In)를 타겟팅합니다. """ try: device_info = sd.query_devices(device_index, 'input') except Exception as e: print(f"디바이스 초기화 오류: {e}") return print(f"[{device_info['name']}] 디바이스에서 녹음을 시작합니다.") os.makedirs("data/samples", exist_ok=True) timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") filename = f"data/samples/sample_{timestamp}.wav" if duration: print(f"{duration}초 동안 녹음합니다...") recording = sd.rec(int(duration * samplerate), samplerate=samplerate, channels=1, device=device_index, dtype='int16') sd.wait() write(filename, samplerate, recording) print(f"저장 완료: {filename}") else: print("무제한 녹음 모드입니다. 종료하려면 Ctrl+C 키를 누르세요.") audio_data = [] def callback(indata, frames, time, status): if status: print(status, file=sys.stderr) audio_data.append(indata.copy()) try: with sd.InputStream(samplerate=samplerate, channels=1, device=device_index, dtype='int16', callback=callback): while True: sd.sleep(1000) except KeyboardInterrupt: print("\n사용자에 의해 녹음이 중단되었습니다. 파일을 저장합니다...") if audio_data: recording = np.concatenate(audio_data, axis=0) write(filename, samplerate, recording) print(f"저장 완료: {filename}") else: print("저장할 오디오 데이터가 없습니다.") if __name__ == "__main__": parser = argparse.ArgumentParser(description="HUTAMS 현장 무전기 Line-in 녹음 툴") parser.add_argument("--list-devices", action="store_true", help="시스템에 연결된 모든 디바이스 목록 출력") parser.add_argument("--device", type=int, help="녹음에 사용할 오디오 디바이스 인덱스", default=None) parser.add_argument("--duration", type=int, help="녹음 길이 (초 단위, 생략시 무제한)", default=None) args = parser.parse_args() if args.list_devices: list_devices() elif args.device is not None: record_audio(args.device, args.duration) else: print("사용법: --device [인덱스] 를 지정하거나 --list-devices 로 디바이스 번호를 확인하세요.") list_devices()