如何在时间控制下产生DTMF音

问题描述

我有一个使用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 (将#修改为@)