diff --git a/requirements.txt b/requirements.txt index c037b86..56059bd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,5 @@ PyQt5==5.15.11 PyQt5_sip==12.17.0 -PyAudioWPatch==0.2.12.7 openai==1.68.2 openai-whisper==20240930 markdown2==2.5.3 @@ -12,4 +11,5 @@ torch==2.6.0 tqdm==4.67.1 numpy==2.1.3 requests==2.32.3 -pyaudiowpatch==0.2.12.7 \ No newline at end of file +pyaudiowpatch==0.2.12.7; sys_platform == 'win32' +pyaudio==0.2.14; sys_platform != 'win32' \ No newline at end of file diff --git a/src/audio_capture.py b/src/audio_capture.py index f3c0207..7c98dee 100644 --- a/src/audio_capture.py +++ b/src/audio_capture.py @@ -1,5 +1,9 @@ # audio_capture.py -import pyaudiowpatch as pyaudio +import sys +if sys.platform == "win32": + import pyaudiowpatch as pyaudio +else: + import pyaudio import wave import os import configparser @@ -38,7 +42,10 @@ def _get_device(self): self.p = pyaudio.PyAudio() try: if self.device_index is None: - self.device_info = self.p.get_default_wasapi_loopback() + if sys.platform == "win32": + self.device_info = self.p.get_default_wasapi_loopback() + else: + self.device_info = self.p.get_default_input_device_info() else: self.device_info = self.p.get_device_info_by_index(self.device_index) @@ -120,47 +127,54 @@ def stop_recording(self): @staticmethod def list_devices(): """设备列表查询(直接使用官方推荐方式)""" - with pyaudio.PyAudio() as p: - # 打印默认输入设备信息 - print("\n=== 默认输入设备 ===") - try: - default = p.get_default_input_device_info() - print(f"* 默认设备: [{default['index']}] {default['name']}") - except Exception as e: - print("! 未找到默认输入设备") + p = pyaudio.PyAudio() + # with pyaudio.PyAudio() as p: + # 打印默认输入设备信息 + print("\n=== 默认输入设备 ===") + try: + default = p.get_default_input_device_info() + print(f"* 默认设备: [{default['index']}] {default['name']}") + except Exception as e: + print("! 未找到默认输入设备") - # 打印默认输出设备信息 - print("\n=== 默认输出设备 ===") - try: - default = p.get_default_output_device_info() - print(f"* 默认设备: [{default['index']}] {default['name']}") - except Exception as e: - print("! 未找到默认输出设备") + # 打印默认输出设备信息 + print("\n=== 默认输出设备 ===") + try: + default = p.get_default_output_device_info() + print(f"* 默认设备: [{default['index']}] {default['name']}") + except Exception as e: + print("! 未找到默认输出设备") - print("\n=== 默认Loopback设备 ===") - try: - default = p.get_default_wasapi_loopback() - print(f"* 默认设备: [{default['index']}] {default['name']}") - except Exception as e: - print("! 未找到默认loopback设备") + print("\n=== 默认Loopback设备 ===") + try: + if sys.platform == "win32": + device = p.get_default_wasapi_loopback() + else: + device = p.get_default_input_device_info() + print(f"* 默认设备: [{default['index']}] {default['name']}") + except Exception as e: + print("! 未找到默认loopback设备") - print("\n所有含有InputChannel的设备:") - for i in range(p.get_device_count()): - dev = p.get_device_info_by_index(i) - if dev["maxInputChannels"] > 0: - print(f"[{dev['index']}] {dev['name']} (输入通道: {dev['maxInputChannels']})") + print("\n所有含有InputChannel的设备:") + for i in range(p.get_device_count()): + dev = p.get_device_info_by_index(i) + if dev["maxInputChannels"] > 0: + print(f"[{dev['index']}] {dev['name']} (输入通道: {dev['maxInputChannels']})") + + print("\n所有含有OutputChannel的设备:") + for i in range(p.get_device_count()): + dev = p.get_device_info_by_index(i) + if dev["maxOutputChannels"] > 0: + print(f"[{dev['index']}] {dev['name']} (输出通道: {dev['maxOutputChannels']})") + + print("\n所有含有Loopback的设备:") + for i in range(p.get_device_count()): + dev = p.get_device_info_by_index(i) + if dev.get("isLoopbackDevice") != None and dev["isLoopbackDevice"] > 0: + print(f"[{dev['index']}] {dev['name']} (Loopback: {dev['maxInputChannels']})") + + p.terminate() - print("\n所有含有OutputChannel的设备:") - for i in range(p.get_device_count()): - dev = p.get_device_info_by_index(i) - if dev["maxOutputChannels"] > 0: - print(f"[{dev['index']}] {dev['name']} (输出通道: {dev['maxOutputChannels']})") - - print("\n所有含有Loopback的设备:") - for i in range(p.get_device_count()): - dev = p.get_device_info_by_index(i) - if dev["isLoopbackDevice"] > 0: - print(f"[{dev['index']}] {dev['name']} (Loopback: {dev['maxInputChannels']})") if __name__ == "__main__": # 列出设备 LoopbackRecorder.list_devices()