Однажды в интервью один всем известный российский музыкант сказал: “Мы работаем над тем, чтобы лежать и плевать в потолок”. Не могу не согласиться с этим утверждением, ведь то, что именно лень является движущей силой в развитии технологий, спору никакого быть не может. И действительно, только за последнее столетие мы перешли от паровых машин к цифровой индустриализации, и теперь искусственный интеллект, о котором писали фантасты и футурологи прошлого столетия, с каждым днём становится всё большей реальностью нашего мира. Компьютерные игры, мобильные устройства, умные часы и многое другое в своей основе используют алгоритмы, связанные с механизмами машинного обучения.
import plotly
import plotly.graph_objs as go
import freesound
import os
import termcolor
#Построение гистограммы в соответствии с данными
def histogram(data, filename = "tmp_histogram.html"):
data = [
go.Histogram(
histfunc="count",
x=data,
name="count",textfont=dict(size=15)
),
]
plotly.offline.plot({
"data": data,
"layout": go.Layout(title="Histogram")
}, auto_open=True, filename=filename)
pass
# Анализ запрашиваемых данных из пространства freesound.org
def freesound_analysis(search_tokens, output, lim_page_count = 1, key = None):
lim_page_count = int(lim_page_count)
try:
client = freesound.FreesoundClient()
client.set_token(key,"token")
print(termcolor.colored("Authorisation successful ", "green"))
except:
print(termcolor.colored("Authorisation failed ", "red"))
classes = list()
for token in search_tokens:
try:
results = client.text_search(query=token,fields="id,name,previews")
output_catalog = os.path.normpath(output)
if not os.path.exists(output_catalog):
os.makedirs(output_catalog)
page_count = int(0)
while True:
for sound in results:
try:
classes.append(token)
info = "Data has been getter: " + str(sound.name)
print(termcolor.colored(info, "green"))
except:
info = "Data has not been getter: " + str(sound.name)
print(termcolor.colored(info, "red"))
page_count += 1
if (not results.next) or (lim_page_count == page_count):
page_count = 0
break
results = results.next_page()
except:
print(termcolor.colored(" Search is failed ", "red"))
histogram(classes)
pass
#Скачивание запрашиваемых данных
def freesound_download(search_tokens, output, lim_page_count = 1, key = None):
lim_page_count = int(lim_page_count)
#Попытка подключения клиента. Необходимо указать полученный ключ
try:
client = freesound.FreesoundClient()
client.set_token(key,"token")
print(termcolor.colored("Authorisation successful ", "green"))
except:
print(termcolor.colored("Authorisation failed ", "red"))
for token in search_tokens:
try:
results = client.text_search(query=token,fields="id,name,previews")
output_catalog = os.path.normpath(output + "\\" + str(token))
if not os.path.exists(output_catalog):
os.makedirs(output_catalog)
page_count = int(0)
while True:
for sound in results:
try:
sound.retrieve_preview(output_catalog)
info = "Saved file: " + str(output_catalog) + str(sound.name)
print(termcolor.colored(info, "green"))
except:
info = str("Sound can`t be saved to " + str(output_catalog) + str(sound.name) )
print(termcolor.colored(info, "red"))
page_count += 1
if not results.next or lim_page_count == page_count:
page_count = 0
break
results = results.next_page()
except:
print(termcolor.colored(" Search is failed ", "red"))
import plotly
import plotly.graph_objs as go
from collections import Counter
import numpy as np
import os
import termcolor
import csv
import json
import youtube_dl
import subprocess
#Построение гистограммы в соответствии с данными
def histogram(data,hist_mean= True, filename = "tmp_histogram.html"):
if hist_mean == True:
cdata = Counter(data)
mean_number_classes = np.asarray([cdata[x] for x in cdata]).mean()
ldata = list()
for name in cdata:
if cdata[name] > mean_number_classes:
ldata += list(Counter({name:cdata[name]}).elements())
trace_mean_data = go.Histogram(histfunc="count", x=ldata, name="count" )
trace_data = go.Histogram(histfunc="count", x=data, name="count", text="" )
trace = [ trace_data, trace_mean_data]
plotly.offline.plot({
"data": trace,
"layout": go.Layout(title="stack")
}, auto_open=True, filename=filename)
pass
#Построение круговой диаграммы в соответствии с данными
def pie_chart(labels, values = None, filename = "tmp_pie_chart.html", textinfo = 'label+value'):
if labels == None:
raise Exception("Can not create pie chart, because labels is None")
if values == None:
data = Counter(labels)
labels = list()
values = list()
for name in data:
labels.append(name)
values.append(data[name])
trace = go.Pie(labels=labels, values=values,textfont=dict(size=20),hoverinfo='label+percent', textinfo=textinfo,
marker=dict(line=dict(color='#000000', width=2))
)
plotly.offline.plot([trace], filename='basic_pie_chart')
pass
#Анализ данных в соответствии с файлом онтологии и выбранного датасета
def audioset_analysis(audioset_file, inputOntology):
if not os.path.exists(inputOntology) or not os.path.exists(audioset_file):
raise Exception("Can not found file")
with open(audioset_file, 'r') as fe:
csv_data = csv.reader(fe)
sx = list()
with open(inputOntology) as f:
data = json.load(f)
duration_hist = list()
for row in csv_data:
if row[0][0] == '#':
continue
classes = row[3:]
try:
color = "green"
tmp_duration = str(float(row[2]) - float(row[1]))
info = str("id: ") + str(row[0]) + str(" duration: ") + tmp_duration
duration_hist.append(tmp_duration)
for cl in classes:
for dt in data:
cl = str(cl).strip().replace('"',"")
if cl == dt['id'] and len(dt['child_ids']) == 0:
sx.append(dt['name'])
info += str(" ")+str(dt['name']) + str(",")
except:
color = "red"
info = "File has been pass: " + str(row[0])
continue
print(termcolor.colored(info, color))
histogram(sx, filename="audioset_class")
pie_chart(duration_hist, textinfo="percent + label", filename="audioset_duration")
#Скачивание файла из youtube
def youtube_download(filepath, ytid):
ydl_opts = {
'format': 'bestaudio/best',
'outtmpl': os.path.normpath(filepath),
'postprocessors': [{
'key': 'FFmpegExtractAudio',
'preferredcodec': 'wav',
'preferredquality': '192',
}],
}
with youtube_dl.YoutubeDL(ydl_opts) as ydl:
ydl.download(['https://www.youtube.com/watch?v={}'.format(ytid)])
pass
#Обрезание файла с использованием ffmpeg
def cutOfPartFile(filename,outputFile, start, end, frequency = 44100):
duration = float(end) - float(start)
command = 'ffmpeg -i '
command += str(filename)+" "
command += " -ar " + str(frequency)
command += " -ss " + str(start)
command += " -t " + str(duration) + " "
command += str(outputFile)
subprocess.call(command,shell=True)
pass
#Преобразование выгруженных файлов из yotube к виду в соответствии с файлом датасета
def audioset_converter(incatalog,outcatalog, token = "*.wav", frequency = 44100):
find_template = os.path.join(incatalog,token)
files = glob(find_template);
for file in files:
_,name = os.path.split(file)
name = os.path.splitext(name)[0]
duration = str(name).split("_")[1:3]
filename = name.split("_")[0] +"."+ token.split(".")[1];
outfile = os.path.join(outcatalog,filename)
cutOfPartFile(file,outfile,start=duration[0],end=duration[1])
#Скачивание соответствующего датасета из audioset
def audioset_download(audioset_file, outputDataset, frequency = 44100):
t,h = os.path.split(audioset_file)
h = h.split(".")
outputDataset_full = os.path.join(outputDataset,str(h[0])+"_full")
outputDataset = os.path.join(outputDataset,str(h[0]))
if not os.path.exists(outputDataset):
os.makedirs(outputDataset)
if not os.path.exists(outputDataset_full):
os.makedirs(outputDataset_full)
with open(audioset_file, 'r') as fe:
csv_data = csv.reader(fe)
duration_hist = list()
for row in csv_data:
if row[0][0] == '#':
continue
try:
color = "green"
tmp_duration = str(float(row[2]) - float(row[1]))
info = str("id: ") + str(row[0]) + str(" duration: ") + tmp_duration
duration_hist.append(tmp_duration)
save_full_file = str(outputDataset_full) + str("//")+ str(row[0]).lstrip()+str("_") +str(row[1]).lstrip() + str("_").lstrip() + str(row[2]).lstrip() + str('.%(ext)s')
youtube_download(save_full_file,row[0])
except:
color = "red"
info = "File has been pass: " + str(row[0])
continue
print(termcolor.colored(info, color))
audioset_converter(outputDataset_full,outputDataset, frequency = frequency)
К сожалению, не доступен сервер mySQL