前提
音声wavファイルを分割した後、Speech Recognitionで文字起こしをするというものを作っています。
対象ファイルは5分2秒。それを240秒で分割するので、できるファイルは2つだけのはずなんですが、ファイルが100個できます。そのうち中に何も入っていない(長さが0秒)ファイルが98個です。
その何も入っていないファイルが原因なのか処理が停止してしまいます。
出力結果を見てみるとTotal timeが24347秒となっており、実際の数字と違うのですが、なぜこんな数字になっているんでしょうか?
ファイルの問題なのかと思いファイルを変えたりしてみましたが同様の問題が起こります。
検索したりしても望む答えを得られなかったので、教えてほしいです。
よろしくお願いいたします。
参考にしたサイト:
https://tacky0612.hatenablog.com/entry/2017/11/21/164409
https://qiita.com/futurebone/items/b3723899235a977f5796
実現したいこと
- 大量の何も入っていないファイルが出る原因を知りたい。
- 結果が実際の数値と違う理由を知りたい。
発生している問題・エラーメッセージ
False
f_name
cut time =
240
Channel: 2
Sample width: 44100
Frame Rate: 44100
Frame num: 1073741823
Params: _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=1073741823, comptype='NONE', compname='not compressed')
Total time: 24347.887142857144
Total time(integer): 24347
Time: 240
Frames: 21168000
Number of cut: 101
[0 0 0 ... 0 0 0]
0
0
21168000
1
21168000
42336000
2
42336000
63504000
...
...
100
2116800000
2137968000
(ファイル2までの認識結果がここに正しく表示されました)
(ファイル2以降は何も入っていないと思うのでこの文が続きます)
Could not understand audio
...
...
#エラーメッセージ(例外)
[Errno 2] No such file or directory: 'output/101.wav'
Python
1import wave 2import struct 3#from scipy import fromstring,int16 4import numpy as np 5import os 6import math 7import speech_recognition as sr 8import pandas as pd 9 10#すでに同じ名前のディレクトリがないか確認 11file = os.path.exists("output") 12print(file) 13 14if file == False: 15 #保存先のディレクトリの作成 16 os.mkdir("output") 17 18#filenameに読み込むファイル、timeにカットする間隔 19def cut_wav(filename, time): 20 #timeの単位は[sec] 21 22 #ファイルを読み出し 23 wavf = filename + '.wav' 24 wr = wave.open(wavf, 'r') 25 26 #waveファイルが持つ情報を取得 27 ch = wr.getnchannels() 28 width = wr.getsampwidth() 29 fr = wr.getframerate() 30 fn = wr.getnframes() 31 total_time = 1.0 *fn / fr 32 integer = math.floor(total_time) 33 t = int(time) 34 frames = int(ch * fr * t) 35 num_cut = int(integer//t) 36 37 #確認用 38 print("Channel: ", ch) 39 print("Sample width: ", fr) 40 print("Frame Rate: ", fr) 41 print("Frame num: ", fn) 42 print("Params: ", wr.getparams()) 43 print("Total time: ", total_time) 44 print("Total time(integer): ", integer) 45 print("Time: ", t) 46 print("Frames: ", frames) 47 print("Number of cut: ", num_cut) 48 49 #waveの実データを取得し、数値化 50 data = wr.readframes(wr.getnframes()) 51 wr.close() 52 X = np.frombuffer(data, dtype=np.int16) 53 print(X) 54 55 for i in range(num_cut): 56 print(i) 57 #出力データを生成 58 outf = 'output/' + str(i) + '.wav' 59 start_cut = int(i*frames) 60 end_cut = int(i*frames + frames) 61 print(start_cut) 62 print(end_cut) 63 Y = X[start_cut:end_cut] 64 outd = struct.pack("h" * len(Y), * Y) 65 66 #書き出し 67 ww = wave.open(outf, 'w') 68 ww.setnchannels(ch) 69 ww.setsampwidth(width) 70 ww.setframerate(fr) 71 ww.writeframes(outd) 72 ww.close() 73 74 str_out = "" 75 list1 = [wavf, "", ""] 76 df_x = pd.DataFrame([list1]) 77 df_x.columns = ['No', '音声ファイル', '変換結果'] 78 79 for ii in range(num_cut +1): 80 outf = 'output/' + str(ii) + '.wav' 81 str_out = wav_to_text(outf) 82 df_x.loc[ii] = [ii, str(ii) + '.wav', str_out] 83 84 #excelへ書き出し 85 with pd.ExcelWriter("output/out.xlsx") as writer: 86 df_x.to_excel(writer, sheet_name='結果', index=False) 87 88def wav_to_text(wavfile): 89 r = sr.Recognizer() 90 91 with sr.AudioFile(wavfile) as source: 92 audio = r.record(source) 93 wav_to_text = 0 94 try: 95 wav_to_text = r.recognize_google(audio, language='en-GB') 96 97 print(wav_to_text) 98 except sr.UnknownValueError: 99 print("Could not understand audio") 100 except sr.RequestError: 101 print("Could not request results from Speech Recognition") 102 103 return wav_to_text 104 105f_name = " " #ここにファイル名を入れる(拡張子は不要) 106print("f_name") 107print("cut time = ") 108cut_time = input() #分割したい秒数を入力 109cut_wav(f_name, cut_time)
補足情報(FW/ツールのバージョンなど)
Python3.10.5

回答1件
あなたの回答
tips
プレビュー