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