質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

2回答

1330閲覧

Perlで、503個のデータを処理したいのですが、413個しか生成されず困っています。

BURI55

総合スコア25

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2018/11/03 21:02

編集2018/11/04 06:08

データ生成に使ったのは、なんかいろいろしてみますで配布されているものを、まほろば 音響モデルを自作する5(音素ラベリング)で修正したsegment_atr503_windows-v1.0で、
hirosibaフォルダにa01から503個のwavデータを置いて実行しましたが、a01からa09とかb01からb09などがスキップされて413個しかそれぞれデータが生成されません。どうすれば、全てのデータが得られますでしょうか?

アドバイスで、
Padreを入れました。
今すぐ試すPadreのデバッグ支援機能
を参考にステップ実行及び変数のチェックを試しています。

Pealtidyを入れ整形しました。perltidyを使ってみましたperltidy - Perlソースコード整形ツールを参考にしました。

Peal

1#!/usr/bin/perl 2#atr503 labels wav 3#名前はa01からj53までとする。 4$speaker = "hiroshiba"; 5$label = "labels"; 6@abc = ( a, b, c, d, e, f, g, h, i, j ); 7## julius4 executable 8$julius4bin = "julius"; 9 10## acoustic model 11$hmmdefs = "./models/hmmdefs_monof_mix16_gid.binhmm"; # monophone model 12 13## working directory 14$TMPDIR = "."; 15 16mkdir $speaker . "/mono"; 17mkdir $speaker . "/full"; 18mkdir $speaker . "/raw"; 19@filenum = ( 0, 0 ); 20$abcnum = 0; 21while () 22#### initialize 23{ 24 25 if ( $filenum[0] == 5 && $filenum[1] == 3 ) { 26 $filenum[0] = 0; 27 $filenum[1] = 0; 28 $abcnum += 1; 29 } 30 if ( $abcnum == 10 ) { 31 print "Error: cannot open wav file ¥n"; 32 print "push key¥n"; 33 <STDIN>; 34 die; 35 } 36 if ( $filenum[1] == 9 ) { 37 $filenum[0] += 1; 38 $filenum[1] = 0; 39 } 40 else { 41 $filenum[1] += 1; 42 } 43 $filename = $abc[$abcnum] . $filenum[0] . $filenum[1]; 44 $monofile = $label . "/mono/${filename}.lab"; 45 $fullfile = $label . "/full/${filename}.lab"; 46 $speechfile = $speaker . "/${filename}.wav"; 47 48 print "Start segmentation $filename ¥n"; 49 if ( -r $speechfile ) { 50#### generate speech grammar 'tmp.dfa' and 'tmp.dict' from transcription 51 52 # clean temporary file 53 unlink("$TMPDIR/tmp.dfa") if ( -r "$TMPDIR/tmp.dfa" ); 54 unlink("$TMPDIR/tmp.dict") if ( -r "$TMPDIR/tmp.dict" ); 55 56## read transcription 57 @words = (); 58 $line = 0; 59 open( TRANS_MONO, "$monofile" ); 60 while (<TRANS_MONO>) { 61 chomp; 62 next if /^[ ¥t¥n]*$/; 63 if ( $line == 1 ) { 64 s/pau/sp/; 65 s/A/a/; 66 s/I/i/; 67 s/U/u/; 68 s/E/e/; 69 s/O/o/; 70 s/cl/q/; 71 s/sil$/silE/; 72 s/[0-9]+//g; 73 s/ //g; 74 } 75 if ( $line == 0 ) { 76 s/sil$/silB/; 77 s/[0-9]+//g; 78 s/ //g; 79 $line = 1; 80 } 81 push( @words, $_ ); 82 } 83 close(TRANS_MONO); 84 $num = $#words; 85 86 # write dfa 87 open( DFA, ">$TMPDIR/tmp.dfa" ); 88 for ( $i = 0; $i <= $num; $i++ ) { 89 $str = sprintf( "%d %d %d 0", $i, $num - $i, $i + 1 ); 90 if ( $i == 0 ) { 91 $str .= " 1¥n"; 92 } 93 else { 94 $str .= " 0¥n"; 95 } 96 print DFA "$str"; 97 } 98 $str = sprintf( "%d -1 -1 1 0¥n", $num + 1 ); 99 print DFA "$str"; 100 close(DFA); 101 102 # write dict 103 open( DICT, ">$TMPDIR/tmp.dict" ); 104 for ( $i = 0; $i <= $num; $i++ ) { 105 $w = shift(@words); 106 $str = "$i [w_$i] $w¥n"; 107 $WLIST{"w_$i"} = "$w"; 108 print DICT "$str"; 109 } 110 close(DICT); 111 112 # check generated files 113 if ( ( !-r "$TMPDIR/tmp.dfa" ) || ( !-f "$TMPDIR/tmp.dfa" ) ) { 114 die "Error: failed to make ¥"$TMPDIR/tmp.dfa¥"¥n"; 115 } 116 if ( ( !-r "$TMPDIR/tmp.dict" ) || ( !-f "$TMPDIR/tmp.dict" ) ) { 117 die "Error: failed to make ¥"$TMPDIR/tmp.dict¥"¥n"; 118 } 119 120#### execute Julius4 and store the output to log 121 $command 122 = "echo $speechfile | $julius4bin -h $hmmdefs -dfa $TMPDIR/tmp.dfa -v $TMPDIR/tmp.dict -input file -spmodel null -48 -palign"; 123 system("$command > ${monofile}.log"); 124 125#### remove temporary file 126 unlink("$TMPDIR/tmp.dfa"); 127 unlink("$TMPDIR/tmp.dict"); 128 129#### open result file for writing 130 $logfile_mono = "${speaker}/mono/${filename}.lab"; 131 $logfile_mono =‾ s/wav//; 132 $logfile_full = "${speaker}/full/${filename}.lab"; 133 $logfile_full =‾ s/wav//; 134 open( RESULT_MONO, ">$logfile_mono" ); 135 open( RESULT_FULL, ">$logfile_full" ); 136 137#### parse log and append result to speechfile.align 138 open( LOG, "${monofile}.log" ); 139 open( TRANS_MONO, "$monofile" ); 140 open( TRANS_FULL, "$fullfile" ); 141 $sw = 0; 142 while (<LOG>) { 143 chomp; 144 if (/re-computed AM score:/) { 145 $sw = 0; 146 } 147 if ( $sw == 2 ) { 148 $data_mono = <TRANS_MONO>; 149 $data_mono =‾ s/¥n//; 150 $data_mono =‾ s/^[0-9]+ [0-9]+//g; 151 $data_full = <TRANS_FULL>; 152 $data_full =‾ s/¥n//; 153 $data_full =‾ s/^[0-9]+ [0-9]+//g; 154 s/-[0-9]+.[0-9]+//; 155 s/[[]//; 156 s/[]]//; 157 s/[a-zA-Z]+//g; 158 s/ +//; 159 s/ +/ /g; 160 @num = split( /¥s/, $_ ); 161 $num[0] = $num[0] * 100000; 162 $num[1] = ( $num[1] + 1 ) * 100000; 163 164 if ( $num[1] != 0 ) { 165 print RESULT_MONO "@num" . "$data_mono¥n"; 166 print RESULT_FULL "@num" . "$data_full¥n"; 167 } 168 } 169 if ( $sw == 1 ) { 170 $sw = 2; 171 } 172 if (/ id: from to n_score unit/) { 173 $sw = 1; 174 } 175 } 176 close(LOG); 177 close(RESULT_MONO); 178 close(RESULT_FULL); 179 close(TRANS_MONO); 180 close(TRANS_FULL); 181 unlink "${monofile}.log"; 182 system( 183 "echo $speechfile | sox -t wav $speechfile -t raw -L -2 -s $speaker/raw/${filename}.raw" 184 ); 185 } 186}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

まず、インデントの付け方がおかしいので修正してください。これだけでも制御構造の書き方の誤りに気付けることは多いです。

次にデバッガの使い方を覚えてください。出力されるはずにもかかわらず出力されないデータの処理ステップに達したところで実行を一時停止し、その時点での変数の内容がすべて期待通りか確かめてください。異常な値を示すものがあればその変数を定義している部分の周辺に問題がある可能性が高いと判断できます。

解決したようだけど追記:
ああ力技で解決ですか。じつはファイル名の生成では範囲演算子というのを使えばいいので、最初の20行ぐらいは一行にまとめることができたのです。途中までコメントを書きかけていたので、サンプルだけ書いておきます。

foreach $filenamebase (map {my $x=$_; map{$x.$_} "01".."10"} "a".."j"){ print "$filenamebase\n"; }

投稿2018/11/04 02:16

編集2018/11/04 07:13
KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BURI55

2018/11/04 04:04

PealのIDEが必要でしょうか?
BURI55

2018/11/04 04:52 編集

Padreを入れることができました。インデントのつけ方や制御構造はわかりませんが、デバッガの使い方を覚えて、なんとか頑張ってみたいと思います。
BURI55

2018/11/04 04:51 編集

もしかしてif文のインデントがおかしいということでしょうか?if文が制御構造ということでしょうか?
BURI55

2018/11/04 05:21

Pealtidyで整形しました。
BURI55

2018/11/04 06:00

デバッガのステップイン実行で変数の変化を解析しました。#initializeで、$filenameがa1からa9の時にはループしていて、次に実行が行かないようです。a10からは次に実行が行くので生成されているのではないでしょうか?
BURI55

2018/11/04 06:02

ということは#initializeがおかしいということになりますか?
BURI55

2018/11/04 06:09 編集

変数に異常な値を示しているものはないですね。遷移がおかしい?
guest

0

自己解決

元データの形式がおかしかったです。a01.wavからa09.wavを与えなくてはならないところ、a1.wavからa9wavとなっていました。手入力ですべて修正したところ、正常に吐き出しました。

投稿2018/11/04 06:47

BURI55

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問