0

I need to split a given .wav file into 1 second wav files for an android application. Is there any library I can use and if not what method should I follow.

Bee
  • 1

1 Answers1

0

here is a bash shell script which splits a wav file into 1 second clips by calling ffmpeg ... I run this on my linux laptop ... I do not know whether ffmpeg is available on android it is available as a library callable from say c or java

#!/bin/bash

#  https://stackoverflow.com/questions/50087271/how-to-preprocess-audio-data-for-input-into-a-neural-network/50088265#50088265


#  Split a wav file into multiple optionally overlapping .wav files using ffmpeg
#  https://stackoverflow.com/questions/51188268/split-a-wav-file-into-multiple-overlapping-wav-files-using-ffmpeg

input_audio=${HOME}/Lee_Smolin_Physics_Envy_and_Economic_Theory-cWn86ESze6M_mono_1st_few_seconds.wav
# input_audio=${HOME}/Lee_Smolin_Physics_Envy_and_Economic_Theory-cWn86ESze6M_mono_1st_few_seconds.mp3

output_dir="./output_v08"

if [[ ! -d "$output_dir" ]]; then

    echo "mkdir -p ${output_dir}"
          mkdir -p "${output_dir}"
fi

# output_audio_prefix=output_v03/aaa
output_audio_prefix="${output_dir}/aaa"

snip_duration=1.0  # in seconds
# snip_duration=1.5  # in seconds

#   https://ffmpeg.org/ffmpeg.html
#   https://ffmpeg.org/ffmpeg-utils.html#time-duration-syntax

# ffmpeg -i input.mp3 -ss 10 -t 6 -acodec copy output.mp3
# ffmpeg -i $input_audio -ss 0 -t 1 -acodec copy $output_audio_prefix

:<<'good_here'  #  this is a bulk comment to show an example of what below loop is doing
ffmpeg -i $input_audio -ss 0    -t $snip_duration  -acodec copy ${output_audio_prefix}.0.00.wav
ffmpeg -i $input_audio -ss 0.20 -t $snip_duration -acodec copy ${output_audio_prefix}.0.20.wav
ffmpeg -i $input_audio -ss 0.40 -t $snip_duration -acodec copy ${output_audio_prefix}.0.40.wav
ffmpeg -i $input_audio -ss 0.60 -t $snip_duration -acodec copy ${output_audio_prefix}.0.60.wav
ffmpeg -i $input_audio -ss 0.80 -t $snip_duration -acodec copy ${output_audio_prefix}.0.80.wav
ffmpeg -i $input_audio -ss 1.00 -t $snip_duration -acodec copy ${output_audio_prefix}.1.00.wav
good_here

start_point=0               #  start from beginning of audio file
# slide_window_over_time=500  #  in milliseconds
slide_window_over_time=1000  #  in milliseconds

# ffmpeg -i $input_audio  -af astats -f null -


echo input_audio $input_audio

if [[ ! -f $input_audio ]]; then

    echo "ERROR - input file does not exist -->$input_audio<-- "
    exit
fi

# duration_input_audio=$( ffprobe -i $input_audio  -show_entries format=duration -v quiet -of csv="p=0" | bc * 1000 )
duration_input_audio=$( ffprobe -i $input_audio  -show_entries format=duration -v quiet -of csv="p=0" )

echo duration_input_audio $duration_input_audio


duration_in_milli_float=$( echo "$duration_input_audio * 1000" | bc )

echo duration_in_milli_float $duration_in_milli_float

duration_in_milli_int=${duration_in_milli_float%.*}

echo duration_in_milli_int $duration_in_milli_int

echo start_point $start_point


for((curr_window_start=$start_point;$curr_window_start<=$duration_in_milli_int;)) do

    echo curr_window_start $curr_window_start

    curr_window_start_seconds=$( echo "$curr_window_start / 1000" | bc -l )

    echo curr_window_start_seconds $curr_window_start_seconds

    curr_output_file=${output_audio_prefix}.${curr_window_start_seconds}.wav

    echo curr_output_file $curr_output_file

    # ffmpeg -i $input_audio -ss 0.60 -t $snip_duration -acodec copy ${output_audio_prefix}.0.60.wav
    ffmpeg -i $input_audio -ss $curr_window_start_seconds  -t $snip_duration -acodec copy ${curr_output_file}

    # ...

    curr_window_start=$( echo "$curr_window_start + $slide_window_over_time" | bc )
done


# .......... above can also be achieved directly by executing

#  echo
#  echo  above can also be achieved directly by executing
#  echo

#  ffprobe -f lavfi -i amovie=${input_audio},astats=metadata=1:reset=1 -show_entries frame=pkt_pts_time:frame_tags=lavfi.astats.Overall.RMS_level,lavfi.astats.1.RMS_level,lavfi.astats.2.RMS_level -of csv=p=0

above works however you can certainly roll your own code in say java to split a wav file into clips ... it may take a couple days of coding or less once up to speed on digital audio, make that a couple of weeks if starting from a stand still as it involves notions like data endianness and multi byte storage of say 16 bit integers

Scott Stensland
  • 26,870
  • 12
  • 93
  • 104