mirror of
https://github.com/damp11113/xHE-Opus.git
synced 2025-04-27 06:28:08 +00:00
79 lines
2.3 KiB
Python
79 lines
2.3 KiB
Python
import numpy as np
|
|
import pyaudio
|
|
import os
|
|
from libxheopus import DualOpusEncoder, xOpusDecoder
|
|
|
|
encoder = DualOpusEncoder("restricted_lowdelay", 48000, "hev2")
|
|
encoder.set_bitrates(24000)
|
|
encoder.set_bitrate_mode("CVBR")
|
|
encoder.set_bandwidth("fullband")
|
|
encoder.set_compression(10)
|
|
desired_frame_size = encoder.set_frame_size(120)
|
|
|
|
decoder = xOpusDecoder(48000)
|
|
|
|
p = pyaudio.PyAudio()
|
|
|
|
device_name_input = "Line 5 (Virtual Audio Cable)"
|
|
device_index_input = 0
|
|
for i in range(p.get_device_count()):
|
|
dev = p.get_device_info_by_index(i)
|
|
if dev['name'] == device_name_input:
|
|
device_index_input = dev['index']
|
|
break
|
|
|
|
device_name_output = "Speakers (2- USB Audio DAC )"
|
|
device_index_output = 0
|
|
for i in range(p.get_device_count()):
|
|
dev = p.get_device_info_by_index(i)
|
|
if dev['name'] == device_name_output:
|
|
device_index_output = dev['index']
|
|
break
|
|
|
|
streaminput = p.open(format=pyaudio.paInt16, channels=2, rate=48000, input=True, input_device_index=device_index_input)
|
|
streamoutput = p.open(format=pyaudio.paInt16, channels=2, rate=48000, output=True, output_device_index=device_index_output)
|
|
|
|
print(desired_frame_size)
|
|
|
|
try:
|
|
while True:
|
|
try:
|
|
pcm = np.frombuffer(streaminput.read(desired_frame_size, exception_on_overflow=False), dtype=np.int16)
|
|
|
|
if len(pcm) == 0:
|
|
# If PCM is empty, break the loop
|
|
break
|
|
|
|
encoded_packets = encoder.encode(pcm)
|
|
|
|
print(len(pcm), "-encoded->", len(encoded_packets))
|
|
|
|
|
|
# print(encoded_packet)
|
|
try:
|
|
decoded_pcm = decoder.decode(encoded_packets)
|
|
except Exception as e:
|
|
decoded_pcm = b""
|
|
|
|
|
|
# Check if the decoded PCM is empty or not
|
|
if len(decoded_pcm) > 0:
|
|
pcm_to_write = np.frombuffer(decoded_pcm, dtype=np.int16)
|
|
|
|
streamoutput.write(pcm_to_write.astype(np.int16).tobytes())
|
|
else:
|
|
print("Decoded PCM is empty")
|
|
|
|
except Exception as e:
|
|
print(e)
|
|
raise
|
|
|
|
except KeyboardInterrupt:
|
|
print("Interrupted by user")
|
|
finally:
|
|
# Clean up PyAudio streams and terminate PyAudio
|
|
streaminput.stop_stream()
|
|
streaminput.close()
|
|
streamoutput.stop_stream()
|
|
streamoutput.close()
|
|
p.terminate() |