Я пытаюсь построить список "кадров".Но я не могу правильно построить график, не зная, сколько элементов в этом списке фреймов.или есть какой-либо другой способ построить сумму графиков греха.Тип кадров - это список.Но когда я печатаю, это показывает, как массив NumPy.Я использую значения numpy sin внутри этого списка.когда я посчитал len из списка кадров, он показывается как 1. Но мне нужно найти, сколько значений в этом массиве.Также, пожалуйста, предложите мне какой-нибудь более простой и хороший способ для построения результатов. Целью кода является генерация тонов dtmf 0-9 и построение суммы графиков греха.генерируются тоны, но я застрял в части прорисовки.
FORMAT = pyaudio.paFloat32
CHANNELS = 1
RATE = 44100
CHUNK = 1024
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "dtmf.wav"
p = pyaudio.PyAudio()
def sine_wave(frequency, length, rate):
length = int(length * rate)
factor = float(frequency) * (math.pi * 2) / rate
return np.sin(np.arange(length) * factor)
def sine_sine_wave(f1, f2, length, rate):
s1=sine_wave(f1,length,rate)
s2=sine_wave(f2,length,rate)
ss=s1+s2
sa=np.divide(ss, 2.0)
return sa
def play_tone(stream, frequency=440, length=0.10, rate=44100):
frames = []
frames.append(sine_wave(frequency, length, rate))
chunk = np.concatenate(frames) * 0.25
stream.write(chunk.astype(numpy.float32).tostring())
def play_dtmf_tone(stream, digits, length=0.2, rate=44100):
dtmf_freqs = {'1': (1209,697), '2': (1336, 697), '3': (1477, 697),
'4': (1209,770), '5': (1336, 770), '6': (1477, 770),
'7': (1209,852), '8': (1336, 852), '9': (1477, 852),
'*': (1209,941), '0': (1336, 941), '#': (1477, 941)}
dtmf_digits = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#']
if type(digits) is not type(''):
digits=str(digits)[0]
digits = ''.join ([dd for dd in digits if dd in dtmf_digits])
joined_chunks = []
print(digits)
for digit in digits:
digit=digit.upper()
frames = []
frames.append(sine_sine_wave(dtmf_freqs[digit][0], dtmf_freqs[digit][1], length, rate))
chunk = np.concatenate(frames) * 0.25
joined_chunks.append(chunk)
# fader section
fade = 200 # 200ms
fade_in = np.arange(0., 1., 1/fade)
fade_out = np.arange(1., 0., -1/fade)
chunk[:fade] = np.multiply(chunk[:fade], fade_in) # fade sample wave in
chunk[-fade:] = np.multiply(chunk[-fade:], fade_out) # fade sample wave out
time.sleep(0.1)
X = np.array(joined_chunks, dtype='float32') # creates an one long array of tone samples to record
stream.write(X.astype(np.float32).tostring()) # to hear tones
list_test = frames
N = 100
time_max = 1
d_time = time_max/N
times = np.linspace(0, time_max,N)
print(("frames :{}").format(frames))
print(type(frames))
print(len(frames))
plt.plot(times, frames)
# record tone sequence float 32 array as a wave file section
for i in range(0, int(RECORD_SECONDS)):
waveFile = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
waveFile.setnchannels(CHANNELS)
waveFile.setsampwidth(p.get_sample_size(FORMAT))
waveFile.setframerate(RATE)
waveFile.writeframes(X.astype(np.float32).tostring())
waveFile.close()
if __name__ == '__main__':
stream = p.open(format=pyaudio.paFloat32,
channels=1, rate=44100, output=1,frames_per_buffer=CHUNK)
# Dial a telephone number.
if len(sys.argv) != 2:
user_input = input()
sp_user_input = user_input.split()
digits = str(np.array([sp_user_input])) # set random length of numbers to pluck from list a
# below preps random list of numbers for inclusion into csv file
digits=digits.replace("[",'') # replace characters with null
digits=digits.replace("]",'')
digits=digits.replace("'",'')
digits=digits.replace("\n",'')
digits=digits.replace(" ",'') # replace space with null
print(digits)
else:
digits = sys.argv[2]
play_dtmf_tone(stream, digits)
stream.close()
p.terminate()