طبقه بندی صدا با YAMNet

مشاهده در TensorFlow.org در Google Colab اجرا شود در GitHub مشاهده کنید دانلود دفترچه یادداشت مدل TF Hub را ببینید

YAMNet یک شبکه عمیق است که پیش بینی 521 رویداد های صوتی است کلاس از لاشه AudioSet-یوتیوب آن را در آموزش دیده بود. این اثر Mobilenet_v1 depthwise از هم جدا معماری پیچیدگی.

import tensorflow as tf
import tensorflow_hub as hub
import numpy as np
import csv

import matplotlib.pyplot as plt
from IPython.display import Audio
from scipy.io import wavfile

مدل را از TensorFlow Hub بارگیری کنید.

# Load the model.
model = hub.load('https://tfhub.dev/google/yamnet/1')

فایل برچسب را از دارایی های مدل لود شده و در حال حاضر در است model.class_map_path() . شما آن را در بارگذاری class_names متغیر است.

# Find the name of the class with the top score when mean-aggregated across frames.
def class_names_from_csv(class_map_csv_text):
  """Returns list of class names corresponding to score vector."""
  class_names = []
  with tf.io.gfile.GFile(class_map_csv_text) as csvfile:
    reader = csv.DictReader(csvfile)
    for row in reader:
      class_names.append(row['display_name'])

  return class_names

class_map_path = model.class_map_path().numpy()
class_names = class_names_from_csv(class_map_path)

روشی را اضافه کنید تا تأیید کنید و تبدیل صدای بارگذاری شده با نرخ نمونه مناسب (16K) باشد، در غیر این صورت بر نتایج مدل تأثیر می‌گذارد.

def ensure_sample_rate(original_sample_rate, waveform,
                       desired_sample_rate=16000):
  """Resample waveform if required."""
  if original_sample_rate != desired_sample_rate:
    desired_length = int(round(float(len(waveform)) /
                               original_sample_rate * desired_sample_rate))
    waveform = scipy.signal.resample(waveform, desired_length)
  return desired_sample_rate, waveform

دانلود و آماده سازی فایل صوتی

در اینجا شما یک فایل wav را دانلود کرده و به آن گوش خواهید داد. اگر فایلی از قبل در دسترس دارید، فقط آن را در colab آپلود کنید و به جای آن از آن استفاده کنید.

curl -O https://storage.googleapis.com/audioset/speech_whistling2.wav
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  153k  100  153k    0     0   267k      0 --:--:-- --:--:-- --:--:--  266k
curl -O https://storage.googleapis.com/audioset/miaow_16k.wav
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  210k  100  210k    0     0   185k      0  0:00:01  0:00:01 --:--:--  185k
# wav_file_name = 'speech_whistling2.wav'
wav_file_name = 'miaow_16k.wav'
sample_rate, wav_data = wavfile.read(wav_file_name, 'rb')
sample_rate, wav_data = ensure_sample_rate(sample_rate, wav_data)

# Show some basic information about the audio.
duration = len(wav_data)/sample_rate
print(f'Sample rate: {sample_rate} Hz')
print(f'Total duration: {duration:.2f}s')
print(f'Size of the input: {len(wav_data)}')

# Listening to the wav file.
Audio(wav_data, rate=sample_rate)
Sample rate: 16000 Hz
Total duration: 6.73s
Size of the input: 107698
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/ipykernel_launcher.py:3: WavFileWarning: Chunk (non-data) not understood, skipping it.
  This is separate from the ipykernel package so we can avoid doing imports until

wav_data نیاز دارد که به ارزش ها در نرمال شود [-1.0, 1.0] (همانطور که در مدل اعلام کرد مستندات ).

waveform = wav_data / tf.int16.max

اجرای مدل

اکنون بخش آسان: با استفاده از داده‌هایی که از قبل آماده شده‌اند، فقط مدل را فراخوانی کرده و امتیازات، جاسازی و طیف‌گرام را دریافت می‌کنید.

امتیاز نتیجه اصلی است که از آن استفاده خواهید کرد. طیف نگاری که بعداً برای انجام برخی تجسم ها استفاده خواهید کرد.

# Run the model, check the output.
scores, embeddings, spectrogram = model(waveform)
scores_np = scores.numpy()
spectrogram_np = spectrogram.numpy()
infered_class = class_names[scores_np.mean(axis=0).argmax()]
print(f'The main sound is: {infered_class}')
The main sound is: Animal

تجسم

YAMNet همچنین برخی اطلاعات اضافی را برمی گرداند که می توانیم برای تجسم استفاده کنیم. بیایید نگاهی به شکل موج، طیف‌نگار و کلاس‌های برتر استنباط‌شده بیندازیم.

plt.figure(figsize=(10, 6))

# Plot the waveform.
plt.subplot(3, 1, 1)
plt.plot(waveform)
plt.xlim([0, len(waveform)])

# Plot the log-mel spectrogram (returned by the model).
plt.subplot(3, 1, 2)
plt.imshow(spectrogram_np.T, aspect='auto', interpolation='nearest', origin='lower')

# Plot and label the model output scores for the top-scoring classes.
mean_scores = np.mean(scores, axis=0)
top_n = 10
top_class_indices = np.argsort(mean_scores)[::-1][:top_n]
plt.subplot(3, 1, 3)
plt.imshow(scores_np[:, top_class_indices].T, aspect='auto', interpolation='nearest', cmap='gray_r')

# patch_padding = (PATCH_WINDOW_SECONDS / 2) / PATCH_HOP_SECONDS
# values from the model documentation
patch_padding = (0.025 / 2) / 0.01
plt.xlim([-patch_padding-0.5, scores.shape[0] + patch_padding-0.5])
# Label the top_N classes.
yticks = range(0, top_n, 1)
plt.yticks(yticks, [class_names[top_class_indices[x]] for x in yticks])
_ = plt.ylim(-0.5 + np.array([top_n, 0]))

png