生成性字典学习
考虑加性噪声情况下,对于单通道语音增强来说,其信号模型可以表示为
x
(
t
)
=
s
(
t
)
+
n
(
t
)
x\left( t \right)=s\left( t \right)+n\left( t \right)
x(t)=s(t)+n(t)
经过STFT写成幅度谱的表示形式为
X
=
S
+
N
\mathbf{X}=\mathbf{S}+\mathbf{N}
X=S+N
利用近似K-SVD算法(稀疏表示的算法改为LARC算法)对已有的干净语言训练样本
S
t
r
a
i
n
{{\mathbf{S}}^{train}}
Strain和噪声训练样本
N
t
r
a
i
n
{{\mathbf{N}}^{train}}
Ntrain进行学习,得到干净语音字典
D
S
{{\mathbf{D}}_{S}}
DS和噪声字典
D
N
{{\mathbf{D}}_{N}}
DN,将其组合成一个总字典
D
=
[
D
S
,
D
N
]
\mathbf{D}=\left[ {{\mathbf{D}}_{S}},{{\mathbf{D}}_{N}} \right]
D=[DS,DN]。
在降噪阶段,对测试带噪语言可以表示为
X
t
e
s
t
=
D
×
C
=
[
D
S
,
D
N
]
×
[
C
S
C
N
]
{{\mathbf{X}}^{test}}=\mathbf{D}\times \mathbf{C}=\left[ {{\mathbf{D}}_{S}},{{\mathbf{D}}_{N}} \right]\times \left[ \begin{matrix} {{\mathbf{C}}_{S}} \\ {{\mathbf{C}}_{N}} \\ \end{matrix} \right]
Xtest=D×C=[DS,DN]×[CSCN]
因此,利用LARC算法,对带噪语音进行稀疏表示,可以求得其在两个字典上的稀疏表示系数
C
S
t
e
s
t
\mathbf{C}_{S}^{test}
CStest和
C
N
t
e
s
t
\mathbf{C}_{N}^{test}
CNtest,从而得到增强后的语音幅度谱
S
^
=
D
S
×
C
S
t
e
s
t
\mathbf{\hat{S}}={{\mathbf{D}}_{S}}\times \mathbf{C}_{S}^{test}
S^=DS×CStest
对增强后的语音幅度谱
S
^
\mathbf{\hat{S}}
S^乘以带噪信号的相位后进行ISTFT即可增强后的时域语音信号.
具体过程可以表示为
互补联合字典学习
由于带噪语音和干净语音或者噪声之间存在包含与被包含的关系,即前者与后者存在着一定的映射关系,那么可以考虑基于联合训练字典的方法来进行语音增强。
在训练阶段,将带噪语音和干净语音联合训练
m
i
n
D
s
,
D
x
1
,
C
1
∥
X
−
D
x
1
C
1
∥
F
2
+
∥
S
−
D
s
C
1
∥
F
2
s
.
t
.
f
(
C
1
)
≤
μ
\underset{{{\mathbf{D}}_{s}},{{\mathbf{D}}_{x1}},{{\mathbf{C}}_{1}}}{\mathop{min}}\,\left\| \mathbf{X}-{{\mathbf{D}}_{x1}}{{\mathbf{C}}_{1}} \right\|_{F}^{2}\text{+}\left\| \mathbf{S}-{{\mathbf{D}}_{s}}{{\mathbf{C}}_{1}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{C}}_{1}} \right)\le \mu
Ds,Dx1,C1min∥X−Dx1C1∥F2+∥S−DsC1∥F2s.t. f(C1)≤μ
其中
D
x
1
{{\mathbf{D}}_{x1}}
Dx1与
D
s
{{\mathbf{D}}_{s}}
Ds分别为带噪语音字典和干净语音字典,
C
1
{{\mathbf{C}}_{1}}
C1为相同的稀疏表示系数,
f
(
C
1
)
f\left( {{\mathbf{C}}_{1}} \right)
f(C1)表示对
C
1
{{\mathbf{C}}_{1}}
C1的稀疏约束,
μ
\mu
μ为稀疏约束阈值。
带噪语音和噪声联合训练
m
i
n
D
n
,
D
x
2
,
C
2
∥
X
−
D
x
2
C
2
∥
F
2
+
∥
N
−
D
n
C
2
∥
F
2
s
.
t
.
f
(
C
2
)
≤
μ
\underset{{{\mathbf{D}}_{n}},{{\mathbf{D}}_{x2}},{{\mathbf{C}}_{2}}}{\mathop{min}}\,\left\| \mathbf{X}-{{\mathbf{D}}_{x2}}{{\mathbf{C}}_{2}} \right\|_{F}^{2}+\left\| \mathbf{N}-{{\mathbf{D}}_{n}}{{\mathbf{C}}_{2}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{C}}_{2}} \right)\le \mu
Dn,Dx2,C2min∥X−Dx2C2∥F2+∥N−DnC2∥F2s.t. f(C2)≤μ
D
x
2
{{\mathbf{D}}_{x2}}
Dx2与
D
n
{{\mathbf{D}}_{n}}
Dn分别为带噪语音字典和噪声字典,
C
2
{{\mathbf{C}}_{2}}
C2为相同的稀疏表示系数。
更进一步地,可以表示为
min
D
s
,
D
x
1
,
C
1
∥
[
X
S
]
−
[
D
x
1
D
s
]
C
1
∥
F
2
s
.
t
.
f
(
C
1
)
≤
μ
\underset{{{\mathbf{D}}_{s}},{{\mathbf{D}}_{x1}},{{\mathbf{C}}_{1}}}{\mathop{\min }}\,\left\| \left[ \begin{matrix} \mathbf{X} \\ \mathbf{S} \\ \end{matrix} \right]-\left[ \begin{matrix} {{\mathbf{D}}_{x1}} \\ {{\mathbf{D}}_{s}} \\ \end{matrix} \right]{{\mathbf{C}}_{1}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{C}}_{1}} \right)\le \mu
Ds,Dx1,C1min∥∥∥∥[XS]−[Dx1Ds]C1∥∥∥∥F2s.t. f(C1)≤μ
min
D
n
,
D
x
2
,
C
2
∥
[
X
N
]
−
[
D
x
2
D
n
]
C
2
∥
F
2
s
.
t
.
f
(
C
2
)
≤
μ
\underset{{{\mathbf{D}}_{n}},{{\mathbf{D}}_{x2}},{{\mathbf{C}}_{2}}}{\mathop{\min }}\,\left\| \left[ \begin{matrix} \mathbf{X} \\ \mathbf{N} \\ \end{matrix} \right]-\left[ \begin{matrix} {{\mathbf{D}}_{x2}} \\ {{\mathbf{D}}_{n}} \\ \end{matrix} \right]{{\mathbf{C}}_{2}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{C}}_{2}} \right)\le \mu
Dn,Dx2,C2min∥∥∥∥[XN]−[Dx2Dn]C2∥∥∥∥F2s.t. f(C2)≤μ
利用近似K-SVD算法更新字典,利用LARC算法进行稀疏表示,交替迭代求解最终得到两组字典
D
x
1
{{\mathbf{D}}_{x1}}
Dx1和
D
s
{{\mathbf{D}}_{s}}
Ds、
D
x
2
{{\mathbf{D}}_{x2}}
Dx2和
D
n
{{\mathbf{D}}_{n}}
Dn。
在增强阶段,用训练得到的两组联合字典
D
x
1
{{\mathbf{D}}_{x1}}
Dx1和
D
s
{{\mathbf{D}}_{s}}
Ds、
D
x
2
{{\mathbf{D}}_{x2}}
Dx2和
D
n
{{\mathbf{D}}_{n}}
Dn,我们对测试的带噪语音
X
t
e
s
t
{{\mathbf{X}}^{test}}
Xtest进行两路的稀疏表示
E
1
∗
=
arg
m
i
n
E
1
∥
X
t
e
s
t
−
D
x
1
E
1
∥
F
2
s
.
t
.
f
(
E
1
)
≤
μ
\mathbf{E}_{1}^{*}=\arg \underset{{{\mathbf{E}}_{1}}}{\mathop{min}}\,\left\| {{\mathbf{X}}^{test}}-{{\mathbf{D}}_{x1}}{{\mathbf{E}}_{1}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{E}}_{1}} \right)\le \mu
E1∗=argE1min∥∥Xtest−Dx1E1∥∥F2s.t. f(E1)≤μ
E
2
∗
=
arg
m
i
n
E
2
∥
X
t
e
s
t
−
D
x
2
E
2
∥
F
2
s
.
t
.
f
(
E
2
)
≤
μ
\mathbf{E}_{2}^{*}=\arg \underset{{{\mathbf{E}}_{2}}}{\mathop{min}}\,\left\| {{\mathbf{X}}^{test}}-{{\mathbf{D}}_{x2}}{{\mathbf{E}}_{2}} \right\|_{F}^{2}s.t.\text{ }f\left( {{\mathbf{E}}_{2}} \right)\le \mu
E2∗=argE2min∥∥Xtest−Dx2E2∥∥F2s.t. f(E2)≤μ
那么,可以得到两路信号
S
^
1
t
e
s
t
=
D
s
E
1
∗
\mathbf{\hat{S}}_{1}^{test}={{\mathbf{D}}_{s}}\mathbf{E}_{1}^{*}
S^1test=DsE1∗
N
^
2
t
e
s
t
=
D
n
E
2
∗
\mathbf{\hat{N}}_{2}^{test}={{\mathbf{D}}_{n}}\mathbf{E}_{2}^{*}
N^2test=DnE2∗
由于考虑的是加性噪声模型,那么
N
^
1
t
e
s
t
=
X
t
e
s
t
−
S
^
1
t
e
s
t
\mathbf{\hat{N}}_{1}^{test}={{\mathbf{X}}^{test}}-\mathbf{\hat{S}}_{1}^{test}
N^1test=Xtest−S^1test
S
^
2
t
e
s
t
=
X
t
e
s
t
−
N
^
2
t
e
s
t
\mathbf{\hat{S}}_{2}^{test}={{\mathbf{X}}^{test}}-\mathbf{\hat{N}}_{2}^{test}
S^2test=Xtest−N^2test
对两路信号进行加权
S
^
t
e
s
t
=
(
1
−
α
)
S
^
1
t
e
s
t
+
α
S
^
2
t
e
s
t
{{\mathbf{\hat{S}}}^{test}}=(1-\alpha )\mathbf{\hat{S}}_{1}^{test}+\alpha \mathbf{\hat{S}}_{2}^{test}
S^test=(1−α)S^1test+αS^2test
N
^
t
e
s
t
=
(
1
−
α
)
N
^
1
t
e
s
t
+
α
N
^
2
t
e
s
t
{{\mathbf{\hat{N}}}^{test}}=(1-\alpha )\mathbf{\hat{N}}_{1}^{test}+\alpha \mathbf{\hat{N}}_{2}^{test}
N^test=(1−α)N^1test+αN^2test
构造时频域上的维纳滤波器
M
=
(
S
^
t
e
s
t
)
2
(
S
^
t
e
s
t
)
2
+
(
N
^
t
e
s
t
)
2
\mathbf{M}=\frac{{{\left( {{{\mathbf{\hat{S}}}}^{test}} \right)}^{2}}}{{{\left( {{{\mathbf{\hat{S}}}}^{test}} \right)}^{2}}+{{\left( {{{\mathbf{\hat{N}}}}^{test}} \right)}^{2}}}
M=(S^test)2+(N^test)2(S^test)2
得到增强后的语音幅度谱
S
~
t
e
s
t
=
M
⊙
X
t
e
s
t
{{\mathbf{\tilde{S}}}^{test}}=\mathbf{M}\odot {{\mathbf{X}}^{test}}
S~test=M⊙Xtest
对增强后的语音幅度
S
^
\mathbf{\hat{S}}
S^乘以带噪信号的相位后进行ISTFT即可增强后的时域语音信号。
具体过程可以表示为
下面对上述几种方法进行仿真,其中加权系数
α
=
0
\alpha=0
α=0时,将其称作为JDL0,加权系数
α
=
1
\alpha=1
α=1时,将其称为JDL1。
仿真参数设置
参数名称 | 参数值 |
---|---|
信噪比 | 10dB |
采样率 | 8KHz |
SFFT点数 | 512 |
字典原子个数 | 800 |
GDL算法的结果如下:
从图中可以看出,经过GDL算法处理后的增强后的语音有了明显的改善,但在细节方面仍存在一些不足。
JDL1算法结果:
从实验结果来看,虽然有一定的效果,但是效果有很大的不足,这是因为,直接利用估计的噪声进行语音增强,显然噪声的信息远不如信号的信息重要,直接利用噪声进行语音增强则会存在较大的误差。
JDL0结果如下:
从结果来看,效果较JDL1有很大的改善,这也验证了上述说法的正确性。
当然这里只给出了两种极端的
α
\alpha
α值,没有很好地利用信号或者是噪声的信息,比如有利用归一化残留分量、基尼系数、自适应权系数等进行加权的,则会取得更好的效果,这里就不再叙述。
关于语音及噪声文件,具体请参考:语音信号处理常用语料库下载地址
参考文献:
[1]罗友. 基于联合字典学习和稀疏表示的语音降噪算法研究[D].中国科学技术大学,2016.
[2]Y. Zhu, J. Fu, X. Xu and Z. Ye, “Modified Complementary Joint Sparse Representations: A Novel Post-Filtering to MVDR Beamforming,” 2019 IEEE International Workshop on Signal Processing Systems (SiPS), 2019, pp. 1-6, doi: 10.1109/SiPS47522.2019.9020522.
[3]Y. Luo, G. Bao, Y. Xu and Z. Ye, “Supervised Monaural Speech Enhancement Using Complementary Joint Sparse Representations,” in IEEE Signal Processing Letters, vol. 23, no. 2, pp. 237-241, Feb. 2016, doi: 10.1109/LSP.2015.2509480.
[4]贾海蓉,王卫梅,王雁,裴俊华.区分性联合稀疏字典交替优化的语音增强[J].西安电子科技大学学报,2019,46(03):74-81.
[5]孙林慧,吴子皓,谢可丽,李平安.基于双层字典学习的单通道语音增强方法[J].信号处理,2020,36(06):1001-1012.