تولید موسیقی با استفاده از یادگیری ماشین

پروژه Course object

هنر و مخصوصا موسیقی، از سال‌ها پیش وسیله‌ای برای ابراز درونیات انسان بوده و پاسخ‌دهنده‌ای به نیاز او به خلق کردن به شمار می‌رود. هنر بخشی از وجود انسان است که حاصل آن می‌تواند از تمام ابعاد درونی انسان باشد؛ می‌تواند نتیجه‌ی یک احساس و یک فکر را با هم درآمیزد و موجودیت جدیدی خلق کند. مشکل این‌جاست که ذهن و فکر انسان محدود است و همیشه نمی‌تواند موقع خلق کردن تمامی حالات را در نظر بگیرد.
پیشرفت تکنولوژی به هنرمندان کمک کرده که برای آثار خود از کامپیوتر کمک بگیرند و طرز فکر تولید شده توسط الگوریتم‌های کامپیوتری‌ را با درونیات خود ترکیب کنند و اثر جدیدی خلق کنند. این موضوع در آهنگسازی هم مرسوم است.
پروژه‌ی Music Composer، پروژه‌ای است که می‌تواند آهنگ‌های جدید و شنیده نشده‌ای تولید کند و به انسان برای خلق آثار جدید ایده بدهد.

مقدمه
الگوریتم‌های هوش مصنوعیِ Generative قدرت بسیار زیادی به ما می‌دهند که بتوانیم هرچیزی که تصور می‌کنیم تولید کنیم. اگر بتوانیم نمونه‌های کافی به سیستم معرفی کنیم، کامپیوتر می‌تواند خروجی‌هایی از همان جنس و با همان حس اما جدیدتر و ‌خلاقانه‌تر برایمان درست کند. در Music Composer هدف این بود که بتوانیم معماری‌ای طراحی کنیم که بتواند موسیقی تولید کند.
برای سنجش و ارزیابی خروجی مدل، دو راه در مقاله‌ها پیدا کردیم؛ یکی این‌که خود انسان‌ها خروجی را گوش دهند و بررسی کنند که سرویس‌هایی برای این منظور ساخته شده و راه دوم این است که از طریق قوانین موسیقی و هارمونی میزان درستی خروجی را بررسی کنیم.

کارهای مرتبط

  • پروژه‌ی Magenta:
    این پروژه توسط برخی از محققان و مهندسین تیم Google Brain آغاز شد، اما بسیاری افراد دیگر نیز به طور قابل توجهی به این پروژه کمک کرده اند. آنها الگوریتم های جدید deep learning وreinforcement learning را برای تولید آهنگ ها، تصاویر، نقاشی ها و سایر مواد آموزشی توسعه می دهند. این نیز یک اکتشاف در ساخت ابزار و رابط‌های هوشمند است که هنرمندان و نوازندگان را قادر می سازد فرآیندهای خود را با استفاده از این مدل ها گسترش دهند. این پروژه با TensorFlow زده شده و open-source است و در GitHub قرار دارد. [1]

  • مقاله‌ی Deep Learning for Music:
    هدف این مقاله این است که بتوانیم یک مدل نسبی از معماری شبکه های عصبی ایجاد کنیم تا سعی کنیم موزیک هایی که هارمونی و ملودی دارند ایجاد کنیم و مثل موسیقی که انسان ها ساخته اند قابل قبول باشند. کارهای قبلی در تولید موسیقی به طور عمده در ایجاد یک ملودی تک متمرکز شده بود. کارهای اخیر در زمینه مدل سازی موسیقی polyphonic، که بر اساس تخمین time series probability density است، موفقیت هایی را تجربه کرده است.[2]

  • پروژه‌ی MusicGenerator:
    این یک پروژه‌ی کامل و نسبتا بزرگ است که توسط یکی از افراد Google Brain پیاده سازی شده است و در ابتدای کار برای ادامه‌ی پروژه به ما کمک کرد و نتیجه های احتمالی را نشان داد. [3]

روش پیاده سازی

پیش‌پردازش دیتا:
دیتاست‌ما مجموعه‌ای به نام Lakh بود [4] که حاوی بیش از 170,000 فایل MIDI است. فایل MIDI، فرمتی برای کارکردن با فایل‌های صوتی‌ است.

MIDI Structure

همانطور که در شکل مشخص است، یک فایل MIDI، شامل تعدادی Track است و هر ترک شامل تعدادی note است. برای پردازش دیتا، ما در هر فایل، فقط trackای را انتخاب کردیم که بیشترین تعداد نت‌ها را داشت. همین‌طور سازهای کوبه‌ای را در نظر نگرفتیم زیرا سیستم نوشتن نت‌های آن با بقیه‌ی سازها مثل پیانو متفاوت است.
هر نت در فایل MIDI، حاوی اطلاعات زمان شروع، زمان پایان، میزان نازکی و کلفتی (pitch) و شدت (velocity) است. ما به جای کار کردن با زمان شروع و زمان پایان، با طول زمان (یعنی اختلاف شروع و پایان) کار کردیم. موقع پردازش و خواندن هر آهنگ، وضعیت توزیع مقادیر این سه پارامتر در آهنگ را محاسبه کردیم و درنهایت نت‌ها را در آهنگ‌ها دسته‌بندی کردیم و به ازای هر آهنگ ورودی به یک لیست از اعداد رسیدیم که هر عدد نماینده‌ی یک نت است.

Data Preprocessing

در مرحله‌ی بعد، آهنگ‌ها دسته‌دسته (batch) می‌شوند و روی هر batch، فرآیند one-hot encoding انجام می‌شود. این فرآیند به ازای هر آهنگ یک وکتور تولید می‌کند که اندازه‌ی آن به اندازه‌ی کل نت‌هاست. در این وکتور، نت‌های موجود در آهنگ مقدار 1 و سایر نت‌ها مقدار 0 می‌گیرند.
در نهایت batchای که hot-encode شده، آماده‌ی ورود به شبکه می‌شود.

مدل:
هدف پروژه تولید موسیقی است. موسیقی داده‌ای sequential است. پس نیاز بود که اولا از مدل‌های generator مثل Encoder-Decoder استفاده کنیم و دوما نیاز بود که از شبکه‌های recurrent مثل LSTM استفاده کنیم.

Encoder-Decoder

هدفEncoder-Decoder این است که اختلاف بین ورودی و خروجی را در زمان train کردن به کمترین حد ممکن برساند. موقع test و infer کردن، با دادن ورودی رندوم به Decoder، می‌توانیم موسیقی‌ جدید تولید کنیم.
روند کار این معماری به این صورت است که از یک سری ورودی (بخش input) به یک وکتور می‌رسیم (بخش code در شکل 3) و مدل بر اساس آن یاد می‌گیرد که با استفاده از آن وکتور خروجی‌ای مشابه ورودی اولیه تولید کند (بخش output در شکل3).
همانطور که قبلا ذکر شد، چون با موسیقی سروکار داریم، داخل Encoder و Decoder، شبکه‌ای از LSTMها قرار دادیم که هر کدام از دو لایه‌ی 1024تایی از LSTMها تشکیل شده‌اند.

فرآیند Train:
در هر iteration، دیتای آماده‌شده که درقالب یک batch که حاوی لیستی از وکتور‌ آهنگ‌هاست، وارد Encoder می‌شود. ورودی وارد دو لایه‌ی LSTM ذکر شده در قبل می‌شود و درنهایت state نهایی Encoder، به عنوان state ورودی به decoder داده می‌شود. Decoder، قسمت اصلی مدل را تشکیل می‌دهد. این روند به شکل قبل ادامه پیدا می‌کند و خروجی نهایی از لایه‌ی softmax عبور می‌کند و لیست‌ خروجی داده‌شده با آهنگ ورودی مقایسه و مقدار loss محاسبه می‌شود. با استفاده از Adam Optimizer، این مقدار را به حداقل می‌رسانیم.

Training Model

فرآیند Inference/Test:
در این بخش از Encoder استفاده‌ای نمی‌شود و صرفا با استفاده از Decoder، آهنگ جدیدی تولید می‌شود. یک نت رندوم به Decoder داده می‌شود و از دو لایه LSTM و همین‌طور لایه‌ی softmax عبور می‌کند و نت بعدی تولید می‌شود. در مرحله‌ی بعدی نت جدید تولید‌شده، به عنوان ورودی به LSTM بعدی داده می‌شود و همین‌ فرآیند تا انتها ادامه پیدا می‌کند تا همه‌ی نت‌ها تولید شود. در واقع برخلاف مرحله‌ی train که ورودی، نت‌های خود آهنگ بود، در این جا برای تولید آهنگ جدید به شبکه‌ اعتماد کردیم. برای سنجش خوب بودن یا بد بودن انتخاب‌های شبکه، accuracy را محاسبه می‌کنیم.

Inference/Testing Model

سایر راه حل ها:

استفاده از GANs به جای Encoder-Decoder:
راه حل دیگری که برای ساخت موسیقی می‌توان از آن استفاده کرد، استفاده از Generative Adversarial Networks یا GANs است.[5] این نوع شبکه‌ها از دو قسمت Generator و Discriminator تشکیل شده‌اند. ورودی شبکه ماتریکسی از اعداد رندوم است که وارد Generator می‌شود و دیتای fake تولید می‌شود. پس از تولید دیتای فیک، به همراه Training Set که حاوی دیتای درست و Real است، وارد بخش Discriminator می‌شود و Discriminator تشخیص می‌دهد که دیتای تولید شده توسط Generator، آیا نزدیک به واقعیت است یا خیر. اگر دیتای تولید شده، واقعی تشخیص داده‌شود، Discriminator امتیاز منفی می‌گیرد و Generator امتیاز مثبت؛ درواقع هر دو بخش هم‌زمان بهبود پیدا می‌کنند. [6]

GANs

این روش جدیدتری نسبت به روشی ‌است که ما استفاده کردیم و بهتر به نظر می‌آید. علت این‌که ما از GANs استفاده نکردیم این بود که هم فرآیند Training سخت‌تری دارد و هم تجربه‌ی ما در پیاده سازی شبکه‌ها برای این‌کار کافی نبود.

استفاده از RNNهای ساده‌تر به جای LSTM:
سایر مدل‌های RNN هم دارای مموری هستند ولی هنگام مواجهه با وابستگی های زمانی طولانی مدت به خوبی عمل نمی‌کنند. این به این دلیل است که مشتق loss شان در طول زمان به صورت نمایی کاهش میابد (gradient vanishing problem).
درواقع LSTMها نوعی از RNN ها هستند که واحد ها و gate های مخصوصی دارند مثل forgetting gate یا ignoring gate. این gate ها که خودشان یک شبکه هستند و وزن دارند و هرکدام train می‌شوند، در نهایت باعث می‌شوند که دیتاهای کم‌اهمیت‌تر فراموش شوند. GRUها هم مثل LSTM ها هستند ولی gate های کمتری دارند و از memory cell جدا استفاده نمی‌کنند. در نهایت استفاده از LSTMها منطقی‌تر به نظر می‌آید.

کارهای آینده

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

  • اگر موسیقی را به دو بخش الکترونیک و غیرالکترونیک تقسیم کنیم، می‌توان گفت که تولید موسیقی غیرالکترونیک برای کامپیوتر ساده‌تر است چون اکثرا برروی هارمونی نت‌ها مانوور داده‌می‌شود. اما در موسیقی الکترونیک، علاوه بر هارمونی و چینش نت‌ها، مسئله‌ی صداسازی و افکت و فیلتر و ترکیب روی لایه‌های صدا نیز مطرح می‌شود که کار کامپیوتر در تولید آثار جدید را می‌تواند بسیار پیچیده‌تر کند و داشتن این توانایی نشانگر اوج قدرت کامپیوتر در تولید موسیقی است.

  • سیستم فعلی قابل تبدیل شدن به یک سیستم Real-Time است؛ به این صورت که می‌توان سیستم را طوری بازطراحی و روی یک DAW (Digital Audio Workstation) پیاده‌سازی کرد که بتواند هم‌زمان با نواختن یک انسان، آن را آنالیز کند و با او هم‌نوازی کند.

  • اگر این پروژه، با پروژه‌ی دیگری که با استفاده از NLP می‌تواند احساس را از یک متن یا یک Speech استخراج کند ترکیب شود، می‌توان کاری کرد که به صورت اتوماتیک موسیقی متن تولید شود. درواقع خروجی سیستم تشخیص احساس وارد سیستم موسیقی می‌شود و بر اساس پارامترهای احساسی تعریف شده برروی متن، خروجی جدید تولید‌ می‌شود.

حرف آخر
با این‌که مدل‌های Generative قدرت بسیار بالایی در خلق کردن دارند، اما یکی از فاکتورهای اصلی‌ای که باعث می‌شود یک اثر هنری روی انسان اثر بگذارد را ندارند؛ احساس. یک مدل Generative ممکن است بتواند یک قطعه‌ی بسیار زیبا از نظر ملودیک تولید کند اما در مقایسه، یک قطعه‌ی بسیار ساده که از اول تا آخر فقط چند نت را تکرار می‌کند اما توسط یک انسان و با الهام از یک حس درست شده از اثر کامپیوتر بسیار زیباتر به نظر می‌آید. کامپیوترها بر اساس الگوریتم‌هایی که ما به آن‌ها دستور‌ می‌دهیم کار می‌کنند و در اصطلاح نرم‌افزاری Error (بدفهمی از خواسته‌ی مسئله) ندارند و در یک کلمه Perfect هستند اما شاید همین ناقص بودن و غیر Perfect بودن انسان‌ است که آثار هنری را در نظر او زیبا و قابل فهم می‌کند.

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

منابع و ارجاعات
[1] https://magenta.tensorflow.org/get-started
[2] https://arxiv.org/abs/1606.04930
[3] https://github.com/Conchylicultor/MusicGenerator
[4] https://colinraffel.com/projects/lmd/#get
[5] https://skymind.ai/wiki/generative-adversarial-network-gan
[6] https://arxiv.org/abs/1406.2661