Commit 5225c753 authored by Jan Kiene's avatar Jan Kiene
Browse files

add wav file support to cutting of test vectors

parent 5aff87b6
Loading
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -52,13 +52,13 @@ def create_short_testvectors():
    for fs in ['48', '32', '16']:
        in_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c.wav"
        cut_gain = "1.0"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut.pcm"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut.wav"
        cut_samples(in_file, cut_file, NUM_CHANNELS, fs + "000", CUT_FROM, CUT_LEN, cut_gain)
        cut_gain = "16.0"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut_{cut_gain}.pcm"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut_{cut_gain}.wav"
        cut_samples(in_file, cut_file, NUM_CHANNELS, fs + "000", CUT_FROM, CUT_LEN, cut_gain)
        cut_gain = ".004"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut_{cut_gain}.pcm"
        cut_file = f"{TEST_VECTOR_DIR}/stvFOA{fs}c_cut_{cut_gain}.wav"
        cut_samples(in_file, cut_file, NUM_CHANNELS, fs + "000", CUT_FROM, CUT_LEN, cut_gain)       


+22 −35
Original line number Diff line number Diff line
@@ -47,6 +47,13 @@ gain: optional gain value to apply to the copied samples

import sys
import platform
import numpy as np
from pathlib import Path

HERE = Path(__file__).parent.resolve()
SCRIPTS_DIR = str(HERE.joinpath("../scripts").resolve())
sys.path.append(SCRIPTS_DIR)
from pyaudio3dtools import audiofile


def usage():
@@ -56,7 +63,7 @@ def usage():

def cut_samples(in_file, out_file, num_channels, sample_rate, start, duration, gain="1.0"):
    """
    Function to cut samples from a 16-bit PCM file.
    Function to cut samples from an audio file (wav or pcm)
    """

    # check for python >= 3.7
@@ -64,45 +71,25 @@ def cut_samples(in_file, out_file, num_channels, sample_rate, start, duration, g
        sys.exit("This script is written for Python >= 3.7. Found: " + platform.python_version())

    # all input parameters are strings - convert some
    num_ch = int(num_channels)
    fs = int(sample_rate)
    start_sec = float(start)
    dur_sec = float(duration)
    gain_f = float(gain)

    with open(in_file, "rb") as fid_in:
        fid_in.seek(0, 2)
        num_in_samples = fid_in.tell() / 2
        num_in_samples_ch = num_in_samples / num_ch
    s, fs = audiofile.readfile(in_file, num_channels, fs, outdtype="float")

    num_in_samples = s.shape[0]
    num_samples_to_skip = int(start_sec * fs)
        dur_samples = dur_sec * fs
        if num_samples_to_skip + dur_samples > num_in_samples_ch:
    dur_samples = int(dur_sec * fs)
    if num_samples_to_skip + dur_samples > num_in_samples:
        sys.exit(
            f"requested too many samples ({num_samples_to_skip}+{dur_samples})"
                + f" - input is too short ({num_in_samples_ch})"
            + f" - input is too short ({num_in_samples})"
        )
        num_bytes_to_skip = num_samples_to_skip * num_ch * 2
        num_bytes_to_copy = dur_samples * num_ch * 2
        fid_in.seek(num_bytes_to_skip, 0)
        num_clip = 0
        with open(out_file, "wb") as fid_out:
            bytes_written = 0
            while bytes_written < num_bytes_to_copy:
                data = fid_in.read(2)
                val = int.from_bytes(data, byteorder="little", signed=True)
                val = int(val * gain_f)
                if val > 32767:
                    val = 32767
                    num_clip += 1
                if val < -32768:
                    val = -32768
                    num_clip += 1
                data = val.to_bytes(2, byteorder="little", signed=True)
                written = fid_out.write(data)
                assert written == 2, f"Error writing data: {written} != {2}"
                bytes_written += 2
        if num_clip:
            print(f"{num_clip} output samples have been clipped.")

    s_out = s[num_samples_to_skip:num_samples_to_skip + dur_samples, :] * gain_f

    audiofile.writefile(out_file, s_out, fs)
    

def main(argv):