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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

Q&A

解決済

1回答

3840閲覧

Python:音声の無音部分自動カット / matplotlib:波形描画

othellon

総合スコア9

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

FFmpeg

FFmpegは、動画と音声を交換できるフリーソフトウェアです。UNIX系OSから派生した、MS-DOSから操作するコマンドラインツールです。libavcodecやlibavformat、libswscale、libavfilterなどを含みます。ライセンスは、コンパイルの際のオプションによりLGPLもしくはGPLに決定されます。対応コーデックや使用できるオプションが多く、幅広く利用されています。

0グッド

0クリップ

投稿2021/09/05 00:30

#・解決したいこと

参考サイトを元にwavファイルを音声波形として認識して、一定の振幅を下回り、
尚且つ一定時間を超える部分(=無音部分)をカットしていく作業を自動化しようと考えています。

条件を満たした部分がをどうやって参考サイトのブルーの透明な棒グラフのような形で反映されるのか分からず途方に暮れています。

下記に自分で実行した手順を記載しますのでポイントなど参考意見を伺えますと幸いです。

#####[参考サイトの画像]
![参考サイトのグラフ


#・音声ファイルの読み込み

Python

1import soundfile as sf 2import numpy as np 3import matplotlib.pyplot as plt 4import os 5 6path = os.listdir('.') 7path.sort(reverse=True) 8 9src_file = os.path.abspath(os.path.join('./','audio.wav')) 10src_file 11 12data, samplerate = sf.read(src_file) 13 14t = np.arange(0, len(data))/samplerate 15 16plt.figure(figsize=(18, 6)) 17plt.plot(t, data) 18plt.show()

#####[wavファイルの波形表示]
wavファイルの波形

#・振幅が0.03を超えない部分を抽出

Python

1thres = 0.03 2amp = np.abs(data) 3b = amp > thres 4 5plt.figure(figsize=(18, 6)) 6plt.plot(t, b) 7plt.plot(t, amp) 8plt.show() 9 10

振幅が0.03を超えない部分を抽出

条件式がでTrueとFalseがそれぞれ1と0に対応?

#・問題部分:反映のさせ方が不明な部分

Python

1 2min_silence_duration = 0.5 3silences = [] 4prev = 0 5entered = 0 6 7for i, v in enumerate(b): 8 if np.array(prev == 1).all() & np.array(v == 0).all(): # enter silence 9 entered = i 10 if np.array(prev == 0).all() & np.array(v == 1).all(): # exit silence 11 duration = (i - entered) / samplerate 12 if duration > min_silence_duration: 13 silences.append({"from": entered, "to": i, "suffix": "cut"}) 14 entered = 0 15 prev = v 16if entered > 0 & entered < len(b): 17 silences.append({"from": entered, "to": len(b), "suffix": "cut"}) 18 19#silencesの中身 20 21# [{'from': 62277, 'to': 103719, 'suffix': 'cut'}, 22# {'from': 122913, 'to': 158973, 'suffix': 'cut'}, 23# {'from': 168893, 'to': 279411, 'suffix': 'cut'}, 24# {'from': 323663, 'to': 393915, 'suffix': 'cut'}, 25# {'from': 411662, 'to': 466864, 'suffix': 'cut'}, 26# {'from': 496069, 'to': 554312, 'suffix': 'cut'}, 27# {'from': 723233, 'to': 793695, 'suffix': 'cut'}, 28# {'from': 814843, 'to': 852034, 'suffix': 'cut'}, 29# {'from': 907374, 'to': 941952, 'suffix': 'cut'}] 30

この0.5秒の沈黙を上回った部分をカットして、リストのsilencesに追加していった後に、
参考サイトの参考画像のようなグラフに変化させるにはどのようにしたらいいでしょうか?

イメージ説明

よろしくお願いしいます。

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

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

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

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

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

jbpb0

2021/09/05 01:13

参考にしてるWebページのコメント欄に質問を書いて、作者に聞いてみたらいかがでしょうか?
guest

回答1

0

ベストアンサー

これでやってみてください。

python

1plt.figure(figsize=(18, 6)) 2plt.plot(t, amp, color='r') 3for d in silences: 4 plt.plot(np.array([d['from'], d['from'], d['to'], d['to']]) / samplerate, [0, 1, 1, 0], color='c') 5 6plt.show() 7

投稿2021/09/05 12:04

ppaul

総合スコア24666

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

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

othellon

2021/09/05 12:19

ありがとうございます!!同じことができました! 見慣れない仕組みだったので一度ppaulさんの回答を理解できるまで復習してみます! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問