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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

562閲覧

ファイルを分割すると大量のごみファイルが出る

Brot

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/09/14 02:16

編集2022/09/14 05:01

前提

音声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

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

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

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

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

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

can110

2022/09/14 03:00

分割部分のコードにはおかしなところはなく実際に24347秒あるように思えます。 対象ファイルが5分2秒というのはどのような手段で確認しているでしょうか。またファイルサイズはどれくらいでしょうか。
Brot

2022/09/14 03:05

ありがとうございます。やはりファイルの問題なのでしょうか。 5分2秒というのはエクスプローラーの詳細から確認しています。 ファイルサイズは50.9 MB (53,436,494 バイト)です。
can110

2022/09/14 04:32 編集

ファイルサイズから5分2秒というのが正しく、フレーム数が異常だと思います。 元ファイルを何らかのwave編集ソフトで編集(開いてそのまま保存)したファイルで試してみてどうなるか?でしょうか。
Brot

2022/09/14 04:50

本当にありがとうございます。おっしゃったとおりにやってみたらうまくできました。
guest

回答1

0

自己解決

元ファイルを編集したら解決しました。
フレーム数が異常だという発想がなかったので助かりました。ありがとうございました。

投稿2022/09/14 05:12

Brot

総合スコア23

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問