ffmpeg进行多通道语音分离
Author: Xin Pan
Date: 2020.05.22
问题
当我们想将一条多通道的语音分离成很多的单通道语音时我们怎么办呢?
解决
假设我已经有了一个多通道的音频文件DTM1_100.wav和一个手机文件phone_left.wav。
使用下边的命令来看看文件信息:
ffprobe .\DTM1_100.wav
可以看到返回如下结果:
ffprobe version N-93397-gf8075b2c91 Copyright (c) 2007-2019 the FFmpeg developers
built with gcc 8.2.1 (GCC) 20190212
#此处省略很多行
Input #0, wav, from '.\DTM1_100.wav':
Duration: 00:00:06.31, bitrate: 24576 kb/s
Stream #0:0: Audio: pcm_s32le ([1][0][0][0] / 0x0001), 48000 Hz, 16 channels, s32, 24576 kb/s
可以看到这个音频48k的采样率、16通道的阵列数据。
使用cooledit打开这个文件我们可以看到音频的时域图,左侧可以看到16通道的拆分:
使用如下的程序,可以将阵列的数据进行拆分:
import os
import sys
import platform
# config-start
Channels = 16 # use $Channels mic array datas.
# config-end
def dirlist(path,savePath):
for i in range(Channels):
saveName = "out_%02d.wav" % (i)
currentSavePath = os.path.join(savePath, saveName)
os.system("ffmpeg -i %s -acodec pcm_s16le -ac 1 -ar 16000 -map_channel 0.0.%d %s -y" %
(path, i, currentSavePath))
# srciptPath = sys.argv[0]
srciptPath = r"C:\Users\abc\Desktop\array_test\DTM1_100.wav"
savePath = r"C:\Users\abc\Desktop\array_test"
dirlist(srciptPath, savePath)
print("Done!")
这里使用的是ffmpeg -i $INPUT_NAME -map_channel 0.0.$N $OUT_NAME
$INPUT_NAME
是输入的名字,-map_channel 0.0.$N
可以将输入文件的$N
通道输出到$OUT_NAME
文件中。在这个示例中$N=[0,15]。至此问题应该就解决了。