- 论坛徽章:
- 307
|
本帖最后由 sunzhiguolu 于 2016-12-22 20:46 编辑
- while (<>) {
- s/\|\s*$/ |/; #匹配以 "|" 字符串结尾的记录,允许行尾的空白; 将其替换为 " |" 的形式
- @A = split; #用空白字符分割每条记录,忽略前导空白字符
- if (!($#A == 5 && $A[1] =~ m/sph2pipe$/ && $A[2] eq "-f" && $A[3] eq "wav" && $A[5] eq "|")) {
- #如果 数组 @A 包含6个元素 并且 第二个元素以 "sph2pipe " 字符串结尾 并且 第三个元素等于 "-f" 字符串 并且 第四个元素等于 "wav" 字符串 并且最后一个元素等于 "|" 字符串的话, 执行取反操作
- # 执行 exit 函数返回码为 "1";
- exit(1);
- }
- #if 条件判断失败的话,执行如下语句;
- $utt = $A[0]; #将第一个元素的值赋值给变量 $utt;
- $sphere_file = $A[4]; #将第五个元素的值赋值给变量 $sphere_file
- if (!open(F, "<$sphere_file")){ #如果打开文件失败的话, 抛出一个异常;
- die "Error opening sphere file $sphere_file";
- }
-
- $sample_rate = -1; $sample_count = -1; # 变量初始化操作
- for ($n = 0; $n <= 30; $n++) { #仅读取文件的前31行记录
- $line = <F>;
- if ($line =~ m/sample_rate -i (\d+)/){
- $sample_rate = $1;
- }
- if ($line =~ m/sample_count -i (\d+)/) {
- $sample_count = $1;
- }
- if ($line =~ m/end_head/) {
- break; #匹配此模式后退出 for 循环
- }
- }
- close(F); #关闭 F 文件句柄
- if ($sample_rate == -1 || $sample_count == -1) {
- die "could not parse sphere header from $sphere_file"; #变量 $sample_rate 或 $sample_count 任意一个依然保持初始化的值的话,抛出一个异常;
- }
- $duration = $sample_count * 1.0 / $sample_rate;
- print "$utt $duration\n"; #打印结果
- }
复制代码 应该能够看懂了。
|
|