gpt4 book ai didi

java - 使用过零率区分浊音/清音语音

转载 作者:搜寻专家 更新时间:2023-11-01 08:03:35 25 4
gpt4 key购买 nike

过零率是沿信号的符号变化率,即信号从正变为负或反向变化的速率。

过零率 Zn 可用于:

1-区分浊音/清音语音2-将清音与静态背景噪音分开。

这是一种简单(但有效)的区分方式浊音和清音语音区域:

 • Voiced region:  lower zero-crossing rate 
• Unvoiced region: higher zero-crossing rate

这是我使用的代码:

        public double evaluate(){
int numZC=0;
int size=signals.length;

for (int i=0; i<size-1; i++){
if((signals[i]>=0 && signals[i+1]<0) || (signals[i]<0 && signals[i+1]>=0)){
numZC++;
}
}

return numZC/lengthInSecond;
}

我的问题是:

1- 我使用过零的目标是消除信号的清音部分,此代码返回过零率。那我该怎么做呢?!

2- 我怎么知道“低”过零率是多少,“高”过零率是多少???

最佳答案

根本问题是,虽然您找到了一种方法来计算样本 block 的过零率,但您不能使用它来区分该 block 内的声音,因为它只给您一个数字来描述您的整个样本 block 。

一个可能的解决方案是将您的大块分成小块,然后处理这些小块。如果你这样做,你很快就会发现你随意制作的小块不适合有声和无声的整齐类别,简单地删除一个 block 或将一个 block 的音量设置为零会让你“断断续续”声音甚至刺耳的咔嗒声,并且不会像您喜欢的那样干净地划分词性。

这可能是一个值得开始的点,因为它更接近您现有的代码,但从长远来看它不会奏效,除非您只是想做一些粗略的事情(在这种情况下,这可能是够好了!)。

要解决此问题,您可能需要考虑计算“瞬时过零率”1,它会更新每个样本的 Zr。

  1. 我使用过零的目标是消除信号的清音部分,此代码返回过零率。那么我该怎么做呢?! 不清楚你想要什么。 “消除”是什么意思?你想沉默还是想跳过这些部分?对于静音,只需将不需要的部分替换为零即可。要跳过,只需删除这些样本。当然,您最终还是会听到咔哒声和砰砰声,但我想您知道如何摆脱它。如果没有,也许您可​​以阅读 linear interpolation.请记住,您几乎肯定必须应用一些启发式方法,例如“不要删除任何小于 n 个样本的部分”。

  2. 我怎么知道“低”过零率是多少,“高”过零率是多少???我想一个好的阈值会大约在 400Hz 左右,但语音不是我的专长。此外,它会因说话者以及可能因语言和其他因素而有所不同。我建议你做一些 sample ,自己看看。

1 这个名称有点误导,您可以说“没有瞬时过零率这样的东西”。我不是来争论这个的;相反,我想使用这个短语,因为它表达了我的意思,我希望你能理解。只要说你应该尽最大努力尽可能频繁地更新 Zr 就够了。例如。像这样:

int lastSign = 0;
int lastCrossing = 0;
float nextZeroCrossing( float newSample ) {
int thisSign = newSample > 0 ? 1 : -1 ;
if( thisSign != lastSign ) {
lastSign = thisSign;
//zero crossing has happened. Update our estimate of Zr using lastCrossing and return that
} else {
++lastCrossing;
//zero crossing has not happened. Return existing Zr
}
}

您可能想要“平滑”nextZeroCrossing() 的输出,因为它往往会跳跃很多。一个简单的指数或移动平均过滤器就可以很好地工作。

关于java - 使用过零率区分浊音/清音语音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17533480/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com