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

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

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

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

Python

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

Q&A

解決済

2回答

1514閲覧

条件を1秒間満たし続けたらforから抜けたい

shirasu10fish

総合スコア35

Python 3.x

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

Python

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

0グッド

1クリップ

投稿2018/07/28 09:57

#質問内容
python3でpyaudioを用いて、音声を録音するプログラムを制作しています。

録音レベル(変数xmax)がしきい値(変数threshold)を上回ると録音が開始されるようになっているのですが、
録音レベル(変数xmax)がしきい値(変数threshold)を1秒間下回り続けたら(または録音開始後10秒たったら)録音を終了するようにしたいです。

つまり、次のプログラムで、変数xmax < 変数threshold の状態が1秒間続いたらfor構文から抜けるようにしたいのです。

python3

1#プログラム抜粋 2 3if xmax > threshold: #録音レベルがしきい値を上回ったら 4 for i in range(0, int(A)): 5 data = stream.read(chunk) 6 all.append(data) 7#int(A)は10秒分の長さ(おそらく)

どのように記述すればよいのかわからず困っています。
どうすれば良いのでしょうか?

#プログラム全体

python3

1# -*- coding: utf-8 -*- 2#マイク0番からの入力を受ける。録音し、保存する。 3 4import pyaudio 5import sys 6import time 7import wave 8import requests 9import os 10import json 11import numpy as np 12 13def recognize_rec(): 14 chunk = 1024 15 FORMAT = pyaudio.paInt16 16 CHANNELS = 1 17 18 CARD = 1 #OUTPUTの指定 19 DEVICE = 0 #OUTPUTの指定 20 21 22 PATH = '/var/tmp/tmp.wav' 23 24 #しきい値。これを超えると録音を開始する。 25 threshold = 0.15 #しきい値 26 27 #サンプリングレート、マイク性能に依存 28 RATE = 16000 29 30 #録音時間の上限 31 RECORD_SECONDS = 10 32 33 #pyaudio 34 p = pyaudio.PyAudio() 35 #マイク0番を設定 36 input_device_index = 0 37 #マイクからデータ取得 38 stream = p.open(format = FORMAT, 39 channels = CHANNELS, 40 rate = RATE, 41 input = True, 42 frames_per_buffer = chunk) 43 44 all = [] 45 46 A = int(RATE) / int(chunk) * int(RECORD_SECONDS) 47 48 print("RATE = " + str(RATE)) 49 print("chunk = " + str(chunk)) 50 print("RECORD_SECONDS = " + str(RECORD_SECONDS)) 51 print("RATE / chunk * RECORD_SECONDS = " + str(A)) 52 print("") 53 54 while True: 55 data = stream.read(chunk) 56 x = np.frombuffer(data, dtype="int16") / 32768.0 57 58 #まずサンプルを取る! 59 xmax = x.max() 60 61 if xmax > threshold: #録音レベルがしきい値を上回ったら 62 for i in range(0, int(A)): #←抜けたいfor構文! 63 data = stream.read(chunk) 64 all.append(data) 65 data = b''.join(all) 66 67 out = wave.open(PATH,'w') 68 out.setnchannels(1) #mono 69 out.setsampwidth(2) #16bits 70 out.setframerate(RATE) 71 out.writeframes(data) 72 out.close() 73 break 74 75 76 #time.sleep(0.5) 77 78 stream.close() 79 p.terminate() 80 81 82if __name__ == '__main__': 83 print(recognize_rec()) 84

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

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

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

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

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

guest

回答2

0

条件が成立したら、タイマなり時刻カウントなりを開始させ、1秒経過を検出すればいいです。
経過までに条件が不成立になれば、時刻カウントをリセットする、ということで

投稿2018/07/28 10:47

y_waiwai

総合スコア87747

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

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

0

ベストアンサー

n個のchunkで連続して閾値を下回ったら、という条件だと次のように書けると思います。

Python

1#録音中断までの時間 2STOP_SECONDS = 1 # [sec] 3B = int(RATE / chunk * STOP_SECONDS) 4 5if xmax > threshold: #録音レベルがしきい値を上回ったら 6 n = 0 # 連続して閾値を下回った回数を記録するための変数 7 8 for i in range(0, int(A)): 9 data = stream.read(chunk) 10 all.append(data) 11 12 x = np.frombuffer(data, dtype="int16") / 32768.0 13 xmax = x.max() 14 if xmax <= threashold: 15 # 閾値を下回っていたらincrementする 16 n += 1 17 else: 18 # 閾値を上回ったらリセットする 19 n = 0 20 21 # 中断判定 22 if n == B: 23 break

投稿2018/07/28 10:45

tachikoma

総合スコア3601

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

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

shirasu10fish

2018/07/29 01:31

上手くいきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問