HTK孤立词语音识别小系统

我主要参考两篇博客搭建起这个语音识别系统的:http://my.oschina.net/jamesju/blog/116151         http://www.cnblogs.com/mingzhao810/archive/2012/08/03/2617674.html

感谢两位博主的无私奉献。

我实现的是6个单词的识别,即:hello, world, port, starboard, standby, steer     新建八个文件夹: def, hmms, models, lab, sig, mfcc, results, test,如图:

1.数据录制与标注,涉及文件夹:sig lab

          在命令提示符中进入当前目录,就是上面八个文件夹所在的目录,然后进入sig目录,我们先把录制的.sig格式语音和.lab格式的标注文件放这里。先录制第一个单词,即“hello.在命令提示符中输入:HSLab hello.sig出现录音与标注界面,按下rec录音,按下stop停止录音,然后按下mark进行标记,并对每一段标记命名(Mark后点Labelas)。前后为静音,中间为识别单词,注意,每段标记需要有一定的间隔,不能重合,否则在使用Hinit的时候会出错。标记完后点击保存,注意命名,默认是hello_0.labhello_1.lab,需要手动更改。如图:


重复录制10遍hello并标注,并用同样方法录制与标注剩余的单词各10遍。然后把sig文件夹里的.lab文件剪切到lab文件夹。hello_1.lab中的数据为:

2.原始语音文件转换为特征矢量文件,涉及文件夹: siglabmfcctest

1)在test文件夹中新建analysis.conf文件,内容为:

SOURCEFORMAT=HTK
TARGETKIND=MFCC_0_D_A
WINDOWSIZE=250000.0
TARGETRATE=100000.0
NUMCEPS=12
USEHAMMING=T
PREEMCOEF=0.97
NUMCHANS=26
CEPLIFTER=22

具体参数介绍详见HTKbook

2)在def文件夹中新建targetlist.txt,内容为(由于有6个单词,每个单词有10条,共60条,故这里我就列出了前10条,即hello的转换,大家照着这个格式复制5遍,把hello替换成其他单词即可):

sig/hello_1.sig mfcc/hello_1.mfcc
sig/hello_2.sig mfcc/hello_2.mfcc
sig/hello_3.sig mfcc/hello_3.mfcc
sig/hello_4.sig mfcc/hello_4.mfcc
sig/hello_5.sig mfcc/hello_5.mfcc
sig/hello_6.sig mfcc/hello_6.mfcc
sig/hello_7.sig mfcc/hello_7.mfcc
sig/hello_8.sig mfcc/hello_8.mfcc
sig/hello_9.sig mfcc/hello_9.mfcc
sig/hello_10.sig mfcc/hello_10.mfcc

然后输入命令:Hcopy -A -D -C test/analysis.conf -S def/targetlist.txt

出现的界面为:

然后在mfcc文件夹中出现.mfcc文件,如图:

3.建立HMM模型,涉及文件夹:modelstesthmmslab

1)在models文件夹中新建7个文件,即:hmm_hello, hmm_world, hmm_port, hmm_starboard, hmm_standby, hmm_steer, hmm_sil

       hmm_hello文件中输入如下内容:

~o <VecSize> 39 <MFCC_0_D_A> 
~h "hello" 
<BeginHMM> 
<NumStates> 10 
<State> 2  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 3  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 4  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 5 
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 6  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 7  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 8  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<State> 9  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<TransP> 10 
0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.5 0.5 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<EndHMM>

其他5个单词只需把~h”hello”中的hello替换即可。

sil即静音模型,在hmm_sil中输入如下内容:

~o <VecSize> 39 <MFCC_0_D_A> 
~h "sil" 
<BeginHMM> 
<NumStates> 3 
<State> 2  
<Mean> 39 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 
<Variance> 39 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 
<TransP> 3 
0.0 1.0 0.0 
0.0 0.5 0.5 
0.0 0.0 0.0 
<EndHMM>

2 hmm初始化

test文件夹中新建trainlist.txt文件,内容为(这里只列出了hello10条,其他5个单词复制5遍替换hello即可):

mfcc/hello_1.mfcc
mfcc/hello_2.mfcc
mfcc/hello_3.mfcc
mfcc/hello_4.mfcc
mfcc/hello_5.mfcc
mfcc/hello_6.mfcc
mfcc/hello_7.mfcc
mfcc/hello_8.mfcc
mfcc/hello_9.mfcc
mfcc/hello_10.mfcc

hmms文件夹中新建hmm0文件夹,然后执行命令:

Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_hello –l hello –L lab hello
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_world –l world –L lab world
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_port –l port –L lab port
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_starboard –l starboard –L lab starboard
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_standby –l standby –L lab standby
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_steer –l steer –L lab steer
Hinit -A -D -T 1 -S test/trainlist.txt -M hmms/hmm0 –H models/hmm_sil –l sil–L lab sil

初始化hello完成界面如图:

所有单词初始化完成后我们可以在hmm0文件夹中得到如下文件:

这一步很容易出错,如果出错请检查数据标注的时候是否有重合。

3)如果初始化成功,则可以进行hmm训练

hmms中新建三个文件夹,hmm1,hmm2,hmm3

使用命令:

HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm1 -H hmms/hmm0/hmm_hello  -l hello  -L lab hello
HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm2 -H hmms/hmm1/hmm_hello  -l hello  -L lab hello
HRest -A -D -T 1 -S test/trainlist.txt -M hmms/hmm3 -H hmms/hmm2/hmm_hello  -l hello  -L lab hello

这里只列出hello的训练,其他单词与sil的训练只需把hello替换成相应单词和sil即可。经过三次迭代后的界面如图:

最后我们可以在hmm3文件中得到如下内容:

4.建立语法规则与字典,涉及文件夹:def

(1)def文件夹中新建gram.txt文件,输入语法:

$WORD=HELLO | WORLD | PORT | STARBOARD | STANDBY | STEER;
({START_SIL}[$WORD]{END_SIL})

(2)def文件夹中新建dict.txt文件,输入字典:

HELLO [hello] hello
WORLD [world] world
PORT [port] port
STARBOARD [starboard] starboard
STANDBY [standby] standby
STEER [steer] steer
START_SIL [sil] sil
END_SIL [sil] sil

(3)建立任务网络

输入命令:Hparse -A -D -T 1 def/gram.txt def/net.slf

def文件中生成了net.slf文件,其内容形式如下:

5.识别,涉及文件夹:def, hmms, models, testresults

(1) results文件夹中新建reco.mlf文件

(2) test文件夹中新建hmmsdef.mmf文件,其内容为hmms/hmm3文件夹中的所有hmm_xxx的数据,注意:在第一个复制进去的hmm_xxx为全部数据,剩下的从第一行的~h开始复制,也就是说只保留第一个~o

(3) 此时可以用一个.mfcc文件进行测试,先在test文件中新建一个hmmlist.txt文件,内容为:

hello
world
port
starboard
standby
steer
sil 

命令为:Hvite -A -D -T 1 -H test/hmmsdef.mmf -i result/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt mfcc /hello_1.mfcc

识别结果的界面为:

看到START_SIL HELLO END_SIL了吗?这就识别出了hello,当然在resuls文件夹中也保存了识别结果:

(4) 交互识别

test文件夹中新建directin.conf文件,内容为:

SOURCERATE=625.0  
SOURCEKIND=HAUDIO
SOURCEFORMAT=HTK  
TARGETKIND=MFCC_0_D_A
WINDOWSIZE=250000.0
TARGETRATE=100000.0
NUMCEPS=12
USEHAMMING=T
PREEMCOEF=0.97
NUMCHANS=26
CEPLIFTER=22
AUDIOSIG=-1

输入命令:Hvite -A -D -T 1 -C test/directin.conf -g -H test/hmmsdef.mmf -w def/net.slf def/dict.txt test/hmmlist.txt

此时出现如下界面:

好了,开始说话吧!说一个单词然后回车就能看到识别结果,然后继续说,如图:

貌似识别率还可以,变着声说都能识别出来。至此,一个简单的孤立词语音识别小系统就算完成了。

6. 性能评价,涉及文件夹:testresults

1)在test文件夹中新建文件ref.mlf,输入内容形如下列(这里只列举hello,每个单词选3.lab文件即可):

#!MLF!#
"lab/hello_1.lab"
20625 5693750 
sil
5778750 10477500 hello
10562500 14500000 sil

"lab/hello_2.lab"
20625 4995000 sil
5058750 12975625 hello
13039375 14500000 sil

"lab/hello_3.lab"
20625 5333750 sil
5397500 10520000 hello
10541250 14500000 sil

2)在test文件夹中新建testlist.txt文件,用以创建测试路径,内容形如下列:

test/mfcc/hello_1.mfcc
test/mfcc/hello_2.mfcc
test/mfcc/hello_3.mfcc
test/mfcc/world_1.mfcc
test/mfcc/world_2.mfcc
test/mfcc/world_3.mfcc
test/mfcc/port_1.mfcc
test/mfcc/port_2.mfcc
test/mfcc/port_3.mfcc
test/mfcc/starboard_1.mfcc
test/mfcc/starboard_2.mfcc
test/mfcc/starboard_3.mfcc
test/mfcc/standby_1.mfcc
test/mfcc/standby_2.mfcc
test/mfcc/standby_3.mfcc
test/mfcc/steer_1.mfcc
test/mfcc/steer_2.mfcc
test/mfcc/steer_3.mfcc

3)使用命令:

Hvite -A -D -T 1 -S test/testlist.txt -H test/hmmsdef.mmf -i results/reco.mlf -w def/net.slf def/dict.txt test/hmmlist.txt 

完成界面为:

results文件中的reco.mlf文件保存了结果:

4)错误率统计

在test文件夹中新建labellist.txt文件,内容为:

lab/hello_1.lab
lab/hello_2.lab
lab/hello_3.lab
lab/world_1.lab
lab/world_2.lab
lab/world_3.lab
lab/port_1.lab
lab/port_2.lab
lab/port_3.lab
lab/starboard_1.lab
lab/starboard_2.lab
lab/starboard_3.lab
lab/standby_1.lab
lab/standby_2.lab
lab/standby_3.lab
lab/steer_1.lab
lab/steer_2.lab
lab/steer_3.lab

然后使用命令:HResults -I test/ref.mlf  test/labellist.txt results/reco.mlf 

得到错误率统计界面:

SENT: %Correct=94.44 为句子识别率,WORD:%Corr=98.11为单词识别率。

7. 总结

HTK建立一个孤立词识别系统还是比较方便的,刚开始接触的时候总会遇到各种问题,得慢慢摸索才能解决。下一步将使用HTK搭建一个小词汇量连续语音识别小系统(200词左右)。所有文件已经上传到CSDNhttp://download.csdn.net/detail/cdj0311/6757935,能直接使用。

 

 


 
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: GMM-HMM是一种用于孤立识别的常见方法之一。在语音识别中,孤立识别是指根据输入的语音信号来识别出特定的单。下面是一个简单的GMM-HMM孤立识别的源代码示例。 该代码示例假设已经有了训练好的GMM-HMM模型,可以使用模型进行识别。 ```python import numpy as np import scipy.io.wavfile as wav from hmmlearn import hmm # 加载预训练好的模型 model = hmm.GMMHMM() model.load('model.pkl') # 读取待识别的语音信号 def read_wav(file_path): sr, signal = wav.read(file_path) return signal # 特征提取 def extract_features(signal): # 在这个示例中,我们假设已经有了一个特征提取的方法 # 可以将信号转换为MFCC系数等特征向量 features = extract_method(signal) return features # 识别 def recognize(file_path): signal = read_wav(file_path) features = extract_features(signal) # 使用模型进行识别 pred = model.predict(features) return pred # 调用识别函数进行识别 file_path = 'test.wav' pred = recognize(file_path) # 输出识别结果 print("识别结果是:", pred) ``` 以上是一个简单的GMM-HMM孤立识别的示例代码。需要注意的是,该代码只是一个框架,具体的实现还需要根据不同的需求进行修改和补充。特别是特征提取部分,需要根据实际情况选择适合的方法。同时,训练模型的部分也没有包含在代码中,需要根据实际情况预先训练好模型并加载进来。 ### 回答2: GMM-HMM(Gaussian Mixture Model - Hidden Markov Model)是一种常用于语音识别中的模型,用于孤立(Isolated Word)的识别。这个模型的实现主要涉及两方面的代码:GMM训练和HMM模型构建。 首先是GMM的训练。GMM是用于建模语音特征的概率密度函数。训练GMM的源代码主要包括以下步骤: 1. 数据准备:收集一系列单的语音样本,并提取相应的特征,如MFCC(Mel-Frequency Cepstral Coefficients)等。 2. 初始化GMM参数:确定GMM的混合数量、每个混合的协方差矩阵等。 3. Expectation-Maximization(EM)算法迭代:以高斯混合概率密度函数为初始模型,通过迭代将GMM参数逐步优化。 4. 计算期望值(Expectation):根据当前的GMM参数,计算每个样本属于每个混合的概率。 5. 更新参数(Maximization):根据上一步计算出的期望值,更新GMM的混合权重、均值和协方差矩阵。 6. 重复步骤4和5,直到达到一定的收敛条件。 接下来是HMM模型的构建。HMM用于建模语音信号的时序特性。HMM的源代码包括以下关键步骤: 1. 确定HMM的状态数量和转移概率矩阵。 2. 根据语音样本的标注信息,确定每个时刻对应的状态。 3. 初始化HMM的发射概率矩阵,其中每个状态对应一个GMM。 4. 使用Viterbi算法,通过动态规划的方式,计算最优路径,即最可能的状态序列。 5. 通过反向传播算法,更新HMM的参数,包括转移概率矩阵和发射概率矩阵。 6. 重复步骤4和5,直到达到一定的收敛条件。 GMM-HMM的孤立识别源代码就是以上两个部分的结合。首先使用GMM训练得到每个单的GMM模型参数,然后使用HMM模型对每个孤立的时间序列进行识别。具体实现细节可以通过查阅相关的论文和开源项目来获取。 ### 回答3: GMM-HMM是一种常用的语音识别技术,用于孤立识别任务中。下面是一份GMM-HMM孤立识别的源代码示例: 1. 首先,需要准备一个语音训练集,其中包含多个孤立的语音样本。每个样本都需要进行特征提取,可以使用MFCC等常用的特征提取方法。 2. 接下来,需要训练一个GMM模型用于表示每个的声学特征。可以使用开源工具库如Kaldi或HTK来进行此步骤。具体而言,需要使用EM算法来训练GMM,得到每个对应的高斯分布模型。 3. 在训练GMM模型后,需要进一步构建HMM模型。HMM模型是用于建模序列的概率模型,由多个状态和状态转移概率组成。可以使用库如HTK或自己编写代码来进行HMM模型的训练和构建。 4. 训练完HMM模型后,可以进行孤立的识别。首先,对于输入的测试语音样本,也要进行与训练集相同的特征提取。然后,将提取到的特征与每个对应的GMM模型进行比较,计算相似度分数。 5. 最后,根据相似度分数,可以使用一些阈值或决策规则来确定最可能的的标签。常见的方法是使用最大似然估计(MLE)或Viterbi算法来选择最佳路径。 需要注意的是,以上只是GMM-HMM孤立识别的基本步骤和流程,并不能涵盖所有细节。具体的实现过程会涉及到更多的数学计算和算法优化技巧。希望这个简单的源代码示例能够帮助你对GMM-HMM孤立识别有一个初步的了解。如果进一步深入研究,可以参考相关的学术论文或专业书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值