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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

3262閲覧

waveファイルを1秒単位で分割出力したい

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/13 01:56

前提

jupyter notebookにて、サンプルwavファイル"20200720-164610.wav"をスタート(0秒)から0.1秒ずつ進めながら1秒単位で分割出力したいと思っています。
しかし、下記のプログラムでは音声が同じwavファイルが1秒単位で次々に出力されるのみです。
どこが問題か分からないので、ご教授の程お願いいたします。

該当コード

mport wave from pydub import AudioSegment import glob import os os.chdir('C://Users//karita//sound//data') #パス指定 sound=AudioSegment.from_file("20200720-164610.wav",format="wav") #ファイルを読み出し wavf = '20200720-164610.wav' wr = wave.open(wavf, 'r') # waveファイルが持つ性質を取得 ch = wr.getnchannels() width = wr.getsampwidth() fr = wr.getframerate() fn = wr.getnframes() print("チャンネル: ", ch) print("サンプル長: ", width) print("サンプリンググレート: ", fr) print("全オーディオフレーム数: ", fn) print("Params: ", wr.getparams()) print("サンプル時間: ", 1.0 * fn / fr)

チャンネル: 2
サンプル長: 2
サンプリンググレート: 44100
全オーディオフレーム数: 30016667
Params: _wave_params(nchannels=2, sampwidth=2, framerate=44100, nframes=30016667, comptype='NONE', compname='not compressed')
サンプル時間: 680.650045351474

st=0 et=st+1000 int=100 sound1=sound[st:et] while et < fn / fr * 1000 : print(et) print(fn / fr * 1000) #出力ファイル名を"output.wav"(後に改名) sound1.export("output.wav",format="wav") old_name='output.wav' #出力ファイル番号9桁 zero_i = "{0:09d}".format(st) # 新ファイル名を作る new_name = zero_i + ".wav" # 改名する --- (*5) os.rename(old_name, new_name) # 状況を報告 print(old_name + "→" + new_name) #切り出し時間(start:end) st=st+int #0.1秒ずつスタート時間をずらす et=st+1000 #stから1秒単位で分割

1000 #et
680650.045351474 #サンプル時間
output.wav→000000000.wav #改名
1100
680650.045351474
output.wav→000000100.wav
1200
680650.045351474
output.wav→000000200.wav
1300
680650.045351474
output.wav→000000300.wav
1400
680650.045351474
output.wav→000000400.wav
1500
680650.045351474
output.wav→000000500.wav


補足事項

windows10
python3.7.4

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

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

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

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

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

guest

回答2

0

下記のプログラムでは音声が同じwavファイルが1秒単位で次々に出力されるのみです。

sound1をループ中で切り出していないからです。
sound1=sound[st:et]をループ中に入れましょう。

なお提示コードの動作は未検証ですが、私なら以下のようなループを書きます。

Python

1import numpy as np 2 3#fn = 30016667 4fn = 60000 5fr = 44100 6sound = np.arange(fn, dtype=np.uint32) # テストデータ 7 8pos = 0 9while True: 10 st = int(pos * 0.1 * fr) 11 ed = int(st + 1 * fr) 12 pos += 1 13 if ed+1 > fn: 14 break 15 16 # 出力部分 17 sound1 = sound[st:ed] 18 print(f'st={st: 8}, ed={ed: 8}, sound={sound1[0]: 8}...{sound1[-1]: 8}') 19 20#st= 0, ed= 44100, sound= 0... 44099 21#st= 4410, ed= 48510, sound= 4410... 48509 22#st= 8820, ed= 52920, sound= 8820... 52919 23#st= 13230, ed= 57330, sound= 13230... 57329

投稿2020/08/13 03:02

can110

総合スコア38341

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

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

0

ベストアンサー

sound1の値は、whileループの手前で

sound1=sound[st:et]

と設定された後、変更されません。(sound1に代入しているのは、上記の行だけですから)

そのため、whileループの中で

sound1.export("output.wav",format="wav")

と何度もファイルに出力した結果が同じになるのです。

sound1=sound[st:et]

という行を、while文の次の行に追加すると、希望した通りの動作になるのではないでしょうか。(whileループの中でstとetの値が変わっていくので、sound1=sound[st:et]が実行された後のsound1の音声の位置が変わりますから)

投稿2020/08/13 02:42

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2020/08/13 04:51

ありがとうございます。 解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問