在 C 语言中是否有可能[我知道一般来说是可能的 - GOM 播放器可以做到]?让我开始吧……你说什么?
您如何准确识别与其他声音区分开来的人声?
mp3 播放器中的过滤器通常依赖于立体声录音室中的声源(表演者)位于中心的事实。所以他们只是计算通道之间的差异。如果你给他们一个录音,其中表演者的位置没有像他们失败的那样 - 声音不会被提取。
可靠的方法是使用语音检测器。这是一个非常复杂的问题,涉及核心数学和针对您的特定任务对算法进行彻底调整。如果您采用这种方式,您将从阅读语音编码(声码器)开始。
此处讨论了这个确切的主题。它开始是讨论音频编码技术,但在上面的链接页面上有人说
这意味着没有办法从立体声信号中提取语音?
但有人指出,提取声音应该不比消除声音更难。
我会让您进一步阅读,但我怀疑成功提取可能依赖于与乐器相比相对较窄的语音频谱分布。
请注意,原则上不可能完全分离在一个轨道中混合在一起的不同声音。就像您将奶油混合到咖啡中一样 - 混合后,不可能将奶油和咖啡完美分离。
可能有一些智能信号处理技巧可以获得可接受的结果,但通常不可能将声音与音乐完美分离。
查找独立成分分析(ICA)
其中 buf 有 pcm wav 44100 采样率输入数据
整数 voiceremoval (char *buf, int bytes, int bps, int nch) { 短 int *samples = (short int *) buf; int numsamples = 0; 诠释 x = 0; numsamples = 字节 / 2; x = numsamples; 如果(bps == 16) { 短 *a = 样本; 如果 (nch == 2) 而 (x--) { 整数 l, r; l = a[1] - a[0]; r = a[0] - a[1];
if (l < -32768)
l = -32768;
if (l > 32767)
l = 32767; 如果 (r 32767) r = 32767; a[0] = -l; a[1] = r; 一个 += 2; } } 返回0; }
将人声与其他声音区分开来绝非易事。如果您有其他声音的录音,那么您可以参考取消背景声音,这将使您保留人声。
如果背景噪声是某种随机噪声,您将通过使用某种形式的频谱过滤获得胜利。但它并不简单,需要相当多的尝试才能获得好的结果。Adobe Audition 有一个自适应光谱过滤器,我相信...
假设您在整个录制频带上具有相当均匀的频率分布的白噪声(在 44Khz 未压缩录制中,您所说的是 0 到 22Khz)。然后在上面添加声音。显然,声音使用与噪声相同的频率。人声的范围从 ~300Hz 到 ~3400Hz。显然,带通音频会将你的声音范围缩小到 300 到 3400Hz。怎么办?你有一个声音,你有现在带通的白噪声。不知何故,您需要能够消除这种噪音并保持声音的机智。有多种过滤方案,但都会在此过程中损坏语音。
祝你好运,这真的不会简单!