github.com/rita33cool1/iot-system-gateway@v0.0.0-20200911033302-e65bde238cc5/gateway/Implementation/Gateway/PubAudios/PubAudio.py (about) 1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 """ 4 """ 5 __author__ = 'YuJung Wang' 6 __date__ = '2020/04' 7 8 import os 9 import sys 10 import time 11 import librosa 12 import threading 13 import subprocess 14 import paho.mqtt.publish as publish 15 16 all_apps = ['audio1', 'audio2', 'audio3', 'audio4', 'audio5','audio6', 'audio7', 'audio8', 'audio9', 'audio10','audio11', 'audio12'] 17 18 def readQosKnob(): 19 qos_knob_dict = {} 20 with open('../QoSknob.txt', 'r') as rf: 21 for l in rf.readlines(): 22 # QoSknob.txt is empty 23 if ', ' not in l: 24 print('QoSknob.txt is empty') 25 time.sleep(10) 26 return {} 27 # QoSknob.txt is not empty 28 app, knob = l.strip().split(', ', 1) 29 knob = round(float(knob), 3) 30 if knob >= 1: knob = '1' 31 #elif app[:5] == 'audio' and knob < 0.4 and knob >= 0: knob = '0.001' 32 elif app[:5] == 'audio' and knob < 0.4: knob = '0.001' 33 else: knob = str(knob) 34 #if knob == 0: knob = '0.001' 35 if app[:5] == 'audio': 36 #qos_knob_dict[app[:6]] = knob 37 qos_knob_dict[app] = knob 38 print('app', 'knob') 39 print(app, knob) 40 return qos_knob_dict 41 42 def download_audio(number, ratio): 43 try: 44 os.remove('audio_'+str(ratio)+'.wav') 45 except: pass 46 print(' Beginning downloading an audio') 47 url = os.environ['STREAMURL'] + 'audio' + str(number) + '.wav' 48 print('Audio url:', url) 49 # Difault sampling rate: 22050 50 cmd = 'ffmpeg -t 4 -i ' + url + ' -ar ' + str(int(float(ratio)*22050)) + ' audio_' + str(ratio) + '.wav' 51 #cmd = 'ffmpeg -t 4 -i ' + url + ' -ar ' + str(int(float(ratio)*44100)) + ' audio_' + ratio + '.wav' 52 print('cmd:', cmd) 53 subprocess.run(cmd, shell=True) 54 55 ''' 56 def resample(ratio, audio_name, saved_name): 57 # Downsample, original default 22050 58 y, sr = librosa.load(audio_name, sr=None) 59 print('Original sampling rate:', sr) 60 print('Original audio time series:', y.shape) 61 re_sr = int(ratio*sr) 62 #y_ds = librosa.resample(y, sr, sr*ratio) 63 librosa.output.write_wav(saved_name, y, re_sr) 64 y_tmp, sr_tmp = librosa.load(saved_name, sr=None) 65 print('After downsampling, sampling rate:', sr_tmp) 66 print('After downsampling, audio time series:', y_tmp.shape) 67 ''' 68 69 70 if __name__ == '__main__': 71 a = 0 72 qos_knob_dict = {} 73 while True: 74 #tic = time.clock() 75 # Read QoSknob.txt 76 old_qos_knob_dict = qos_knob_dict 77 qos_knob_dict = readQosKnob() 78 79 a = (a%10) + 1 80 # Avoid inaccurate audios: engine, jackhammer and children playing 81 if a == 5 or a==7 or a == 9: 82 a += 1 83 84 # Download audio from stream server with knob x default sampling rate 85 audio_knobs = [] 86 knob = '0' 87 threads = [] 88 for app in qos_knob_dict: 89 # Sampling rate is according to QoSknob.txt 90 knob = qos_knob_dict[app] 91 #if knob != 1 and knob != 0: 92 if knob != '0': 93 if knob not in audio_knobs: 94 while True: 95 try: 96 audio_knobs.append(knob) 97 down_knob_thread = threading.Thread(target=download_audio(a, knob)) 98 down_knob_thread.start() 99 threads.append(down_knob_thread) 100 except: 101 time.sleep(10) 102 continue 103 else: break 104 105 # Wait until all threads are done 106 for thread in threads: 107 thread.join() 108 109 # Publish 110 knob = '0' 111 for app in qos_knob_dict: 112 knob = qos_knob_dict[app] 113 if knob != '0': 114 try: f = open('audio_'+knob+'.wav', 'rb') 115 except: continue 116 filecontent = f.read() 117 publish.single("iot/iscc19/audio/"+app+"/audio_name", str(a), qos=1, hostname=os.environ['BROKER']) 118 publish.single("iot/iscc19/audio/"+app+"/audio", filecontent, qos=1, hostname=os.environ['BROKER']) 119 #toc = time.clock() 120 #print('Used time:', toc-tic) 121 #time.sleep(0.5) 122 #if a == 1: break