问题描述
我有一个使用python生成DTMF音的项目,当按下键盘按钮时,它将输出此按钮的声音,当释放按钮时,声音将停止。从网站上,我找到了此开源代码,除了具有音频输出时间限制外,它非常适合生成DTMF音频,看起来我需要更改play_tone定义。但我不知道。有人可以帮我吗?我真的很感谢,非常感谢! 下面是代码:
'''
DTMF
1209 Hz 1336 Hz 1477 Hz 1633 Hz
697 Hz 1 2 3 A
770 Hz 4 5 6 B
852 Hz 7 8 9 C
941 Hz * 0 # D
2015
originally modified from Noah Spurrier [email protected]
2018 ***new sections***
Fader - fades samples to remove clicks between samples due to different phase angles
DTMF digit record save as csv file - use with deeplearning
record audio as a wave file for playback - use for deeplearning
'''
import math
import numpy as np
import pyaudio
import sys
import time
import wave
import csv
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,rate):
s1=sine_wave(f1,rate)
s2=sine_wave(f2,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,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,'3': (1477,'A': (1633,'4': (1209,770),'5': (1336,'6': (1477,'B': (1633,'7': (1209,852),'8': (1336,'9': (1477,'C': (1633,'*': (1209,941),'0': (1336,'#': (1477,'D': (1633,941)}
dtmf_digits = ['1','2','3','4','5','6','7','8','9','*','0','#','A','B','C','D']
if type(digits) is not type(''):
digits=str(digits)[0]
digits = ''.join ([dd for dd in digits if dd in dtmf_digits])
joined_chunks = []
for digit in digits:
digit=digit.upper()
frames = []
frames.append(sine_sine_wave(dtmf_freqs[digit][0],dtmf_freqs[digit][1],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
# record tone sequence float 32 array as a wave file section (works on python 3.6)
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:
a = ['1','D']
digits = str(np.random.choice(a,20)) # set random length of numbers to pluck from list
# 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)
# writes digits to csv file
with open('Metadata.csv','w') as csvfile:
characters = csv.writer(csvfile,delimiter=' ')
characters.writerows(digits)
else:
digits = sys.argv[1]
play_dtmf_tone(stream,digits)
stream.close()
p.terminate()
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)