#質問内容
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
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。