ivolff

backup3

Oct 26th, 2019
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.89 KB | None | 0 0
  1. import wave
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import matplotlib.ticker as ticker
  5. import math
  6. from flask import Flask
  7. from flask import request
  8. import json
  9.  
  10.  
  11. def get_max(i, lst):
  12. while i < len(lst) and lst[i - 1] < lst[i]:
  13. i += 1
  14. if i == len(lst):
  15. return lst[i - 1]
  16. return lst[i]
  17.  
  18. def get_min(i, lst):
  19. while i < len(lst) and lst[i - 1] > lst[i]:
  20. i += 1
  21. if i == len(lst):
  22. return lst[i - 1]
  23. return lst[i]
  24. types = {
  25. 1: np.int8,
  26. 2: np.int16,
  27. 4: np.int32
  28. }
  29.  
  30. def format_time(x, pos=None):
  31. global duration, nframes, k
  32. progress = int(x / float(nframes) * duration * k)
  33. mins, secs = divmod(progress, 60)
  34. hours, mins = divmod(mins, 60)
  35. out = "%d:%02d" % (mins, secs)
  36. if hours > 0:
  37. out = "%d:" % hours
  38. return out
  39.  
  40. app = Flask(__name__)
  41.  
  42.  
  43. @app.route('/', methods=['POST'])
  44. def main():
  45. data = 0
  46. if request.method == 'POST':
  47. data = request.data
  48. print(str(data)[2:-1])
  49. wav = wave.open(str(data)[2:-1], mode="r")
  50. (nchannels, sampwidth, framerate, nframes, comptype, compname) = wav.getparams()
  51. duration = nframes / framerate
  52. w, h = 800, 300
  53. k = nframes // w // 32
  54. DPI = 72
  55. peak = 256 ** sampwidth // 2
  56. print(duration)
  57. content = wav.readframes(nframes)
  58. samples = np.frombuffer(content, dtype=types[sampwidth])
  59.  
  60. plt.figure(1, figsize=(float(w) / DPI, float(h) / DPI), dpi=DPI)
  61. plt.subplots_adjust(wspace=0, hspace=0)
  62. answer = set()
  63. for n in range(nchannels):
  64. channel = samples[n::nchannels]
  65. channel = channel[0::k]
  66. mmmm = max(channel)
  67. print(len(channel), channel[7000:7100], type(channel))
  68. if nchannels == 1:
  69. channel = channel - peak
  70. tt = int(duration)
  71. arr2 = [0] * tt
  72. psec = len(channel) // tt
  73. for i in range(int(duration)):
  74. arr2[i] = sum(map(lambda x: abs(x), channel[psec * i:psec * (i + 1)])) // tt
  75.  
  76. for i in enumerate(arr2[:120]):
  77. print(i)
  78. moments = []
  79. # for i in range(1, len(arr2) - 10):
  80. # if arr2[i - 1] != 0 and (get_max(i, arr2) / arr2[i - 1] > 3 / 2 or get_min(i, arr2) / arr2[i - 1] < 2 / 3):
  81. # moments.append(i - 1)
  82. # if arr2[i] > arr2[i - 1]:
  83. # answer.add((-get_max(i, arr2) / arr2[i - 1] * (get_max(i, arr2) - arr2[i - 1]), i - 1))
  84. # else:
  85. # answer.add((arr2[i - 1] / get_min(i, arr2) * (get_min(i, arr2) - arr2[i - 1]), i - 1))
  86. for i in range(3, len(arr2) - 10):
  87. if arr2[i] > arr2[i - 1]:
  88. answer.add((-get_max(i, arr2) / arr2[i - 1] * (get_max(i, arr2) - arr2[i - 1]), i - 1))
  89. else:
  90. answer.add((arr2[i - 1] / get_min(i, arr2) * (get_min(i, arr2) - arr2[i - 1]), i - 1))
  91.  
  92. frame = max(60, tt // 5)
  93. # ap = set()
  94. # print(tt // frame + 1)
  95. # anp = set()
  96. # for i in range(tt // frame + 1):
  97. # answer.add(get_peaks1(arr2[i * frame:(i + 1) * frame]) + i * frame)
  98.  
  99. # for i in range(tt // frame):
  100. # answerplacid, answernotplacid = get_peaks1(arr2[frame // 2 + i * frame:(i + 1) * frame + frame // 2])
  101. # # ap.add(answerplacid[0] + frame * i)
  102. # anp.add(answernotplacid[0] + frame * i)
  103. # print(ap, anp)
  104. # answer.update(ap)
  105. # answer.update(anp)
  106.  
  107. ans2 = list(set(map(lambda x: x[1], sorted(answer)[:tt // 60 + 2])))
  108. # print(ans2)
  109. # ans2 = list(answer)
  110. ans2.sort()
  111. stack = []
  112. for i in ans2:
  113. if len(stack) == 0:
  114. stack.append(i)
  115. elif len(stack) > 0 and stack[-1] - i < -5:
  116. stack.append(i)
  117. print(*stack)
  118. return json.encoder.c_encode_basestring(str(stack)[1:-1])
  119.  
  120. if __name__ == '__main__':
  121. app.run()
Advertisement
Add Comment
Please, Sign In to add comment