根据时间点切割音频

1.获取要切割音频的时间点–开始时间&结束时间

从保存好的音频起止时间文件获取start, end, 单位毫秒,float数据

2.获取整个音频的二进制数据

import wave
wf = wave.open(os.path.join(wav_in, wav), 'rb') # 二进制读文件

wav_chn = wf.getnchannels()  		# 获取通道数
wav_sampwidth = wf.getsampwidth()   # 比特宽度 每一帧的字节数 2B--2个字节-2*8=16bit(bit二进制位) 采样位数
wav_samprate = wf.getframerate()	# 帧率  每秒有多少帧 
wav_framenumber = wf.getnframes()	# 当前音频的总帧数

data = wf.readframes(wav_framenumber) # 按帧读音频,返回二进制字符串数据 读取音频所有数据
wf.close()

音频基础:

https://www.cnblogs.com/ldt-/p/10217830.html
采样率,帧率:波是连续(无穷)的,计算机存储是离散(有限)的。要想用有限存储无限,几乎不可能。因此,要每隔一段时间对波进行一次采样。每秒采样次数采样率。长用采样率是44.1kHz(这里的1k不是1024,是1000!!!切记。)。
采样大小,采样宽度:波每一个时刻都有一个对应的能量值,在计算机中用整数存储。通常使用16bit有符号整数存储,采样大小是16bit
位深x采样率x声道数=比特率 ?
https://blog.csdn.net/sinat_33588424/article/details/80239375
readframes:读取声音数据,传递一个参数指定需要读取的长度(以取样点为单位),readframes返回的是二进制数据(一大堆bytes),在Python中用字符串表示二进制数据

https://blog.ailemon.me/2017/08/29/python-read-wav-files/ 同上面信息差不多
https://www.cnblogs.com/LXP-Never/p/10078200.html 更详细一些
https://www.yht7.com/news/18565 soxi --i *.wav
https://www.it1352.com/1686693.html 没太看
https://blog.csdn.net/fzyjsy/article/details/84842568 python绘制语谱图

3.获取对应分割部分音频的数据

buff = data[int(start) * 16 * 2: int(end) * 16 * 2]  # 字符串索引切割
write_wav('xxx' + '.wav'), buff)

时间-毫秒x16x2 : 当前时间音频字符串的索引位置

https://www.pythonheidong.com/blog/article/136913/caedb2ed5110882b5db1/每次执行时Wave_read.getframes(N),都会得到N * sample_width * n_channels字节。
https://blog.csdn.net/qq_42197919/article/details/102541852批量截取2s
https://blog.csdn.net/qq_25883823/article/details/52749279?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v28-1-52749279.nonecase&utm_term=python%E5%B0%86%E9%9F%B3%E9%A2%91%E5%88%87%E5%88%86&spm=1000.2123.3001.4430 pydub

4.将分割的音频数据保存为音频文件

f = wave.open(path, 'wb')
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(16000)
f.writeframes(data) # buff变量值
f.close()
在Java中,可以使用Java Sound API来切割音频文件。下面是一个简单的示例代码,演示如何使用Java Sound API来切割音频文件: ```java import javax.sound.sampled.*; import java.io.File; import java.io.IOException; public class AudioCutter { public static void main(String[] args) { String inputFile = "input.wav"; // 输入音频文件路径 String outputFile = "output.wav"; // 输出音频文件路径 int startSecond = 10; // 起始时间(秒) int endSecond = 20; // 结束时间(秒) try { AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File(inputFile)); AudioFormat format = audioInputStream.getFormat(); long frames = audioInputStream.getFrameLength(); double durationInSeconds = (frames + 0.0) / format.getFrameRate(); // 计算起始和结束帧数 int startFrame = (int) (startSecond * format.getFrameRate()); int endFrame = (int) (endSecond * format.getFrameRate()); // 限制起始和结束帧数在有效范围内 startFrame = Math.max(0, startFrame); endFrame = Math.min((int) frames, endFrame); // 计算切割后的帧数 int cutLength = endFrame - startFrame; // 创建切割后的音频流 AudioInputStream cutAudioInputStream = new AudioInputStream(audioInputStream, format, cutLength); AudioSystem.write(cutAudioInputStream, AudioFileFormat.Type.WAVE, new File(outputFile)); System.out.println("音频切割成功!"); } catch (UnsupportedAudioFileException | IOException e) { e.printStackTrace(); } } } ``` 上述代码中,我们首先使用`AudioSystem.getAudioInputStream()`方法获音频文件的输入流。然后,我们获音频的格式和帧数,并根据起始和结束时间计算出对应的起始和结束帧数。接下来,我们使用`AudioInputStream`的构造函数创建一个切割后的音频流,并使用`AudioSystem.write()`方法将切割后的音频流写入到输出文件中。 请注意,上述代码仅适用于切割WAV格式的音频文件。如果要切割其他格式的音频文件,需要相应地调整代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值