57 lines
1.6 KiB
Python
57 lines
1.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
Author: C0ffymachyne
|
|
License: GPLv3
|
|
Version: 1.0.0
|
|
|
|
Description:
|
|
audio mixing and combining methods
|
|
"""
|
|
|
|
import torch
|
|
|
|
|
|
def combine_audio_files(
|
|
waveform_a: torch.Tensor,
|
|
waveform_b: torch.Tensor,
|
|
sample_rate: int,
|
|
chunk_duration: float = 2.0,
|
|
) -> torch.Tensor:
|
|
"""
|
|
Combine two audio files by alternating 2-second chunks, cropping to the shorter audio.
|
|
|
|
Args:
|
|
waveform_a (torch.Tensor): Tensor of the first audio file (channels x samples).
|
|
waveform_b (torch.Tensor): Tensor of the second audio file (channels x samples).
|
|
sample_rate (int): Sample rate of the audio files.
|
|
chunk_duration (float): Duration of each chunk in seconds (default is 2 seconds).
|
|
|
|
Returns:
|
|
torch.Tensor: Combined waveform.
|
|
"""
|
|
# Crop to the shorter length
|
|
min_length = min(waveform_a.shape[1], waveform_b.shape[1])
|
|
waveform_a = waveform_a[:, :min_length]
|
|
waveform_b = waveform_b[:, :min_length]
|
|
|
|
# Calculate chunk size in samples
|
|
chunk_size = int(chunk_duration * sample_rate)
|
|
|
|
# Determine the total number of samples
|
|
total_samples = waveform_a.shape[1]
|
|
|
|
# Initialize the output waveform
|
|
combined_waveform = []
|
|
|
|
# Alternate chunks between the two audio files
|
|
for start in range(0, total_samples, chunk_size):
|
|
end = min(start + chunk_size, total_samples)
|
|
combined_waveform.append(waveform_a[:, start:end])
|
|
combined_waveform.append(waveform_b[:, start:end])
|
|
|
|
# Concatenate the combined waveform
|
|
combined_waveform = torch.cat(combined_waveform, dim=1)
|
|
|
|
return combined_waveform
|