convert_audio_to_p3.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. # convert audio files to protocol v3 stream
  2. import librosa
  3. import opuslib
  4. import struct
  5. import sys
  6. import tqdm
  7. import numpy as np
  8. def encode_audio_to_opus(input_file, output_file):
  9. # Load audio file using librosa
  10. audio, sample_rate = librosa.load(input_file, sr=None, mono=False, dtype=np.float32)
  11. # Convert sample rate to 16000Hz if necessary
  12. target_sample_rate = 16000
  13. if sample_rate != target_sample_rate:
  14. audio = librosa.resample(audio, orig_sr=sample_rate, target_sr=target_sample_rate)
  15. sample_rate = target_sample_rate
  16. # Get left channel if stereo
  17. if audio.ndim == 2:
  18. audio = audio[0]
  19. # Convert audio data back to int16 after resampling
  20. audio = (audio * 32767).astype(np.int16)
  21. # Initialize Opus encoder
  22. encoder = opuslib.Encoder(sample_rate, 1, opuslib.APPLICATION_AUDIO)
  23. # Encode audio data to Opus packets
  24. # Save encoded data to file
  25. with open(output_file, 'wb') as f:
  26. duration = 60 # 60ms every frame
  27. frame_size = int(sample_rate * duration / 1000)
  28. for i in tqdm.tqdm(range(0, len(audio) - frame_size, frame_size)):
  29. frame = audio[i:i + frame_size]
  30. opus_data = encoder.encode(frame.tobytes(), frame_size=frame_size)
  31. # protocol format, [1u type, 1u reserved, 2u len, data]
  32. packet = struct.pack('>BBH', 0, 0, len(opus_data)) + opus_data
  33. f.write(packet)
  34. # Example usage
  35. if len(sys.argv) != 3:
  36. print('Usage: python convert.py <input_file> <output_file>')
  37. sys.exit(1)
  38. input_file = sys.argv[1]
  39. output_file = sys.argv[2]
  40. encode_audio_to_opus(input_file, output_file)