6

在 C 语言中是否有可能[我知道一般来说是可能的 - GOM 播放器可以做到]?让我开始吧……你说什么?

您如何准确识别与其他声音区分开来的人声?

4

6 回答 6

11

mp3 播放器中的过滤器通常依赖于立体声录音室中的声源(表演者)位于中心的事实。所以他们只是计算通道之间的差异。如果你给他们一个录音,其中表演者的位置没有像他们失败的那样 - 声音不会被提取。

可靠的方法是使用语音检测器。这是一个非常复杂的问题,涉及核心数学和针对您的特定任务对算法进行彻底调整。如果您采用这种方式,您将从阅读语音编码(声码器)开始。

于 2009-10-15T08:37:25.397 回答
2

此处讨论了这个确切的主题。它开始是讨论音频编码技术,但在上面的链接页面上有人说

这意味着没有办法从立体声信号中提取语音?

但有人指出,提取声音应该不比消除声音更难。

我会让您进一步阅读,但我怀疑成功提取可能依赖于与乐器相比相对较窄的语音频谱分布。

于 2009-10-15T08:53:28.127 回答
2

请注意,原则上不可能完全分离在一个轨道中混合在一起的不同声音。就像您将奶油混合到咖啡中一样 - 混合后,不可能将奶油和咖啡完美分离。

可能有一些智能信号处理技巧可以获得可接受的结果,但通常不可能将声音与音乐完美分离。

于 2009-10-15T08:54:10.327 回答
1

查找独立成分分析(ICA)

于 2009-10-20T15:15:16.217 回答
1

其中 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;
}
于 2009-10-20T15:04:57.883 回答
1

将人声与其他声音区分开来绝非易事。如果您有其他声音的录音,那么您可以参考取消背景声音,这将使您保留人声。

如果背景噪声是某种随机噪声,您将通过使用某种形式的频谱过滤获得胜利。但它并不简单,需要相当多的尝试才能获得好的结果。Adobe Audition 有一个自适应光谱过滤器,我相信...

假设您在整个录制频带上具有相当均匀的频率分布的白噪声(在 44Khz 未压缩录制中,您所说的是 0 到 22Khz)。然后在上面添加声音。显然,声音使用与噪声相同的频率。人声的范围从 ~300Hz 到 ~3400Hz。显然,带通音频会将你的声音范围缩小到 300 到 3400Hz。怎么办?你有一个声音,你有现在带通的白噪声。不知何故,您需要能够消除这种噪音并保持声音的机智。有多种过滤方案,但都会在此过程中损坏语音。

祝你好运,这真的不会简单!

于 2009-10-15T10:33:06.380 回答