<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Personal Project on Matias Di Bernardo</title><link>https://dibernardo.netlify.app/tags/personal-project/</link><description>Recent content in Personal Project on Matias Di Bernardo</description><generator>Hugo -- gohugo.io</generator><language>en</language><copyright>Matías Di Bernardo</copyright><lastBuildDate>Sat, 12 Aug 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://dibernardo.netlify.app/tags/personal-project/index.xml" rel="self" type="application/rss+xml"/><item><title>Z-Plane Visualizer</title><link>https://dibernardo.netlify.app/p/z-plane-visualizer/</link><pubDate>Sat, 12 Aug 2023 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/p/z-plane-visualizer/</guid><description>&lt;img src="https://dibernardo.netlify.app/p/z-plane-visualizer/frontz.PNG" alt="Featured image of post Z-Plane Visualizer" />&lt;p>On the &lt;em>Procesamiento Digital de Señales&lt;/em> (Digital Signal Processing) course at UNTREF, we explore the Z-Plane for filtering design with discrete variables. During the class, the professor introduced a tool built in MATLAB that visualizes the magnitude and phase plots in relation to the positions of zeros and poles on the Z-Plane. Inspired by this, I decided to recreate this tool in Python.&lt;/p>
&lt;p>Leveraging my experience with the PyGame library, I was able to build a real-time application that allows for the movement of poles and zeros, enabling users to see how the transfer function changes in real time.&lt;/p>
&lt;h2 id="how-it-works">How It Works
&lt;/h2>&lt;p>First, I map the pixel positions on the Z-Plane to coordinates according to the unit circle representation. Then, I construct the transfer function, where each zero $z_{n}$ is a term in the numerator, and each pole $z_{i}$ is a term in the denominator. With the transfer function $H(z)$, I can plot both the magnitude and phase plots, which are also mappings from the normalized response into a space within the app.&lt;/p>
$$
H(z) = \frac{\sum_{n=0}^{N} (z - z_{n})}{\sum_{i=0}^{N} (z - z_{i})}
$$&lt;p>Each frame recalculates the transfer function. The program performs efficiently because I store the zeros and poles in arrays, enabling faster computations with the help of numpy, which is already highly optimized. This allows real-time visualizations of the changes and provides a more intuitive understanding of the behavior of the Z-Plane. The following code snippet shows how the transfer function is computed using complex exponentials:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">e&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">(&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">exp&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="n">j&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="o">-&lt;/span> &lt;span class="n">root&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">transfer_function&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">zeros&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">poles&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">w&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">linspace&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">pi&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">RES&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">zero&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">zeros&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">num&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">zero&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">for&lt;/span> &lt;span class="n">pole&lt;/span> &lt;span class="ow">in&lt;/span> &lt;span class="n">poles&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">den&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">e&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">w&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">pole&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">H_z&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">num&lt;/span>&lt;span class="o">/&lt;/span>&lt;span class="n">den&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mag&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">abs&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">H_z&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">ang&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">np&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">angle&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">H_z&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">mag&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">ang&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>This project is designed as educational material, providing students with a practical tool to better understand the interactions between poles and zeros in the Z-Plane. It is not intended as a professional filter design tool.&lt;/p>
&lt;h2 id="functionality">Functionality
&lt;/h2>&lt;p>The application has the following functionality:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>Display and move poles/zeros&lt;/strong>: The user can select and choose the position of zero or pole in the Z plane. With the symmetry option active, all the poles and zeros selected or moved are attached to their symmetric par with respect to the imaginary axes.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Order&lt;/strong>: The order of the poles/zeros can be modified with the mouse wheel up to increse or down to decrease. It supports up to order 4. The color of the zero/pole change with the order.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Information&lt;/strong>: Holding the cursor over a pole or zero displays information about the position, symmetry and order.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Zoom&lt;/strong>: With the plus and minus symbols, the user can zoom in and out of the Z plane.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Delete&lt;/strong>: The trash bin symbol clears all the poles and zeros from the plane, and the user can also delete specific poles or zeros by pressing right click on them.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Magnitude Graph&lt;/strong>: The magnitude spectrum displayed in the app is normalized. This decision helps to keep the focus on the shape of the magnitude and it makes sure that the graph is visually meaningful for the user. The downside is that the difference in peak values is not captured.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Phase Graph&lt;/strong>: The phase is displayed unwrapped between $-\pi$ and $\pi$.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="demo">Demo
&lt;/h2>&lt;p>Here is a quick demo of the app in action:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://player.vimeo.com/video/1045497647" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="vimeo video" webkitallowfullscreen mozallowfullscreen allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;p>The source code for this project can be found on this &lt;a class="link" href="https://github.com/MatiasDiBernardo/Z-Plane_Visualizer" target="_blank" rel="noopener"
>repo&lt;/a>.&lt;/p></description></item><item><title>AI learns to play 2048 game</title><link>https://dibernardo.netlify.app/p/ai-learns-to-play-2048-game/</link><pubDate>Fri, 17 Feb 2023 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/p/ai-learns-to-play-2048-game/</guid><description>&lt;img src="https://dibernardo.netlify.app/p/ai-learns-to-play-2048-game/game_img.jpg" alt="Featured image of post AI learns to play 2048 game" />&lt;p>I used this project as an introduction to Reinforcement Learning. Having mostly worked with supervised and unsupervised learning, I wanted to start with a small, simple project to quickly grasp the main ideas and create something fun. I followed this &lt;a class="link" href="https://youtu.be/L8ypSXwyBds" target="_blank" rel="noopener"
>YouTube video&lt;/a> as a reference, which explains how to use Reinforcement Learning (RL) to train a model capable of playing the snake game. To make it more challenging, I applied the same network to the 2048 game.&lt;/p>
&lt;h2 id="code">Code
&lt;/h2>&lt;p>The code has three main components:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>The Game&lt;/strong>: Implements the game logic and the graphical user interface (GUI).&lt;/li>
&lt;li>&lt;strong>Agent&lt;/strong>: Controls the gameplay.&lt;/li>
&lt;li>&lt;strong>AI Model&lt;/strong>: A neural network that learns how to play and guides the agent.&lt;/li>
&lt;/ul>
&lt;h3 id="game-state">Game State
&lt;/h3>&lt;p>I modeled the game state as a 4x4 matrix representing the board. The actions in the game are represented by a vector, with the following possibilities:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Left&lt;/strong>: [1, 0, 0, 0]&lt;/li>
&lt;li>&lt;strong>Right&lt;/strong>: [0, 1, 0, 0]&lt;/li>
&lt;li>&lt;strong>Up&lt;/strong>: [0, 0, 1, 0]&lt;/li>
&lt;li>&lt;strong>Down&lt;/strong>: [0, 0, 0, 1]&lt;/li>
&lt;/ul>
&lt;h3 id="reward">Reward
&lt;/h3>&lt;p>The RL model works with rewards to quantify when the agent performs well or poorly. Initially, I defined the following rewards:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>+10 points&lt;/strong>: When the agent doubles the points. This is crucial because, in 2048, points increase exponentially.&lt;/li>
&lt;li>&lt;strong>-10 points&lt;/strong>: When the game is lost. This serves as a straightforward negative reward.&lt;/li>
&lt;/ul>
&lt;p>Initially, the model showed slow improvement. To address this, I added an additional reward:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>+2 points&lt;/strong>: When points are increased. This reward incentivizes actions that maximize board clearance and progress.&lt;/li>
&lt;/ul>
&lt;h2 id="how-the-model-works">How the Model Works
&lt;/h2>&lt;p>The model is a simple linear neural network. It takes the game state as input and predicts the best next action to maximize the reward.&lt;/p>
&lt;p>Rewards are managed using a technique called Q-Learning. A &lt;em>Q Value&lt;/em> represents the quality of a decision based on the loss function. The loss function is derived from the &lt;em>Bellman Equation&lt;/em>:&lt;/p>
$$
NewQ(s, a) = Q(s, a) + \alpha [R(s, a) + \lambda \, \text{max}Q'(s', a') - Q(s, a)]
$$&lt;p>Where:&lt;/p>
&lt;ul>
&lt;li>$Q(s, a)$: The &lt;em>Q Value&lt;/em> for a specific state and action.&lt;/li>
&lt;li>$\alpha$: Learning rate.&lt;/li>
&lt;li>$R(s, a)$: Reward for a specific state and action.&lt;/li>
&lt;li>$\lambda$: Discount rate.&lt;/li>
&lt;li>$\text{max}Q&amp;rsquo;(s&amp;rsquo;, a&amp;rsquo;)$: Maximum expected future reward.&lt;/li>
&lt;/ul>
&lt;h2 id="experiments-and-results">Experiments and Results
&lt;/h2>&lt;h3 id="random-test-as-a-baseline">Random Test as a Baseline
&lt;/h3>&lt;p>To establish a baseline, I tested the average score achievable by taking random actions. After 1,000 iterations, the average score was &lt;strong>170&lt;/strong>, far below the 2048 points needed to win the game.&lt;/p>
&lt;h3 id="initial-results">Initial Results
&lt;/h3>&lt;p>My initial attempts were discouraging. The model performed worse than random movements. Here are some early results:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Game 1,000&lt;/strong> | Score: 208 | Record: 416 | Mean Score: 200 | Reward: 640&lt;/li>
&lt;li>&lt;strong>Game 1,000&lt;/strong> | Score: 116 | Record: 346 | Mean Score: 161 | Reward: 310&lt;/li>
&lt;li>&lt;strong>Game 1,000&lt;/strong> | Score: 112 | Record: 348 | Mean Score: 146 | Reward: 320&lt;/li>
&lt;/ol>
&lt;p>In these attempts, the agent developed a suboptimal strategy of filling the board before increasing points.&lt;/p>
&lt;h3 id="improvements">Improvements
&lt;/h3>&lt;p>After experimenting with the reward parameters, I focused on the exploration phase. Initially, the &lt;em>exploration games&lt;/em> parameter, which randomly picks moves, was set to 25 games. Increasing this parameter allowed the agent to explore more strategies, leading to better results:&lt;/p>
&lt;ol start="4">
&lt;li>&lt;strong>Game 1,000&lt;/strong> | Score: 478 | Record: 478 | Mean Score: 230&lt;/li>
&lt;li>&lt;strong>Game 1,000&lt;/strong> | Score: 514 | Record: 964 | Mean Score: 382&lt;/li>
&lt;/ol>
&lt;p>As the model improved, I extended the training to more games:&lt;/p>
&lt;ol start="6">
&lt;li>&lt;strong>Game 3,796&lt;/strong> | Score: 770 | Record: 1,366 | Mean Score: 469&lt;/li>
&lt;li>&lt;strong>Game 4,852&lt;/strong> | Score: 631 | Record: 1,462 | Mean Score: 483&lt;/li>
&lt;/ol>
&lt;p>Finally, with 200 exploration games and 5,000 training games, the results were as follows:&lt;/p>
&lt;ol start="8">
&lt;li>&lt;strong>Game 5,000&lt;/strong> | Score: 840 | Record: 1,678 | Mean Score: 512&lt;/li>
&lt;/ol>
&lt;p>Although the model didn&amp;rsquo;t beat the game, I was satisfied with the progress. I believe that with longer training (the final run lasted 4 hours) and additional network layers, it would be possible to win the game using this architecture.&lt;/p>
&lt;h2 id="demo">Demo
&lt;/h2>&lt;p>Here is a demo of the application, showcasing the agent&amp;rsquo;s learning process:&lt;/p>
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;">
&lt;iframe src="https://player.vimeo.com/video/1045495533" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="vimeo video" webkitallowfullscreen mozallowfullscreen allowfullscreen>&lt;/iframe>
&lt;/div>
&lt;p>I implemented keybindings to control the game&amp;rsquo;s speed, providing three options:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Fast&lt;/strong>: For rapid training.&lt;/li>
&lt;li>&lt;strong>Slow&lt;/strong>: To observe and analyze the agent&amp;rsquo;s progress and mistakes.&lt;/li>
&lt;li>&lt;strong>Medium&lt;/strong>: Rarely used.&lt;/li>
&lt;/ul>
&lt;p>The complete code for this project is available in this &lt;a class="link" href="https://github.com/MatiasDiBernardo/RF_2048-game" target="_blank" rel="noopener"
>repository&lt;/a>.&lt;/p></description></item><item><title>Evaluation of different models for Speaker Diarization task</title><link>https://dibernardo.netlify.app/p/evaluation-of-different-models-for-speaker-diarization-task/</link><pubDate>Fri, 04 Nov 2022 00:00:00 +0000</pubDate><guid>https://dibernardo.netlify.app/p/evaluation-of-different-models-for-speaker-diarization-task/</guid><description>&lt;p>This project started as the final assignment for a seminar class at UNTREF called &lt;em>Seminario en Aplicaciones de Redes Neuronales en la recuperación de información musical&lt;/em>. The objective was to use a Siamese Neural Network (SNN) in a different context than the one explored in class (music similarity detection).&lt;/p>
&lt;p>For the final project of this course, we developed an SNN model from scratch using the &lt;em>Keras&lt;/em> framework and the &lt;em>SincNet&lt;/em> architecture to reduce audio dimensionality, achieving good results. Later, to expand this project, I tried another approach by using &lt;em>Wav2Vec&lt;/em> for dimensionality reduction and re-implementing the entire project in the &lt;em>PyTorch&lt;/em> framework. This attempt, however, yielded suboptimal results, indicating that the dimensionality reduction using Wav2Vec lost critical information required for the speaker diarization task.&lt;/p>
&lt;h2 id="speaker-diarization-task">Speaker Diarization Task
&lt;/h2>&lt;p>The goal of a speaker diarization model is to identify different speakers in an audio stream containing multiple speakers. For example, in a podcast with two people (A and B), the model must determine the time steps where speaker A is talking and the time steps where speaker B is speaking (and implicitly identify the periods of silence). These models are incredibly useful for audio editing and analyzing long audio sequences with multiple speakers.&lt;/p>
&lt;h2 id="why-siamese-neural-networks">Why Siamese Neural Networks?
&lt;/h2>&lt;p>In class, we explored the Siamese architecture to compare similarities between pieces of music, developing a tool capable of identifying covers of famous songs.&lt;/p>
&lt;p>A Siamese Neural Network consists of two or more identical subnetworks sharing the same weights and parameters. It is designed to compare input pairs and measure their similarity, typically using a distance metric like Euclidean distance. Each subnetwork processes one input, and the outputs are combined to compute a similarity score.&lt;/p>
&lt;p>With this similarity comparison in mind, we wanted to apply these networks to the speaker diarization task. The idea was to generate speaker embeddings from audio using a pre-trained model and compare the outputs of different audio segments. Based on the similarity score, we aimed to identify the segments where different speakers are talking.&lt;/p>
&lt;h2 id="experiments">Experiments
&lt;/h2>&lt;p>I tested two different methods for audio feature extraction to serve as speaker embeddings.&lt;/p>
&lt;h3 id="keras-implementation-with-sincnet">Keras Implementation with SincNet
&lt;/h3>&lt;p>In this approach, we used the SincNet architecture to extract speaker-specific features from audio. SincNet applies learnable sinc functions as its filters, which are particularly well-suited for audio processing as they mimic traditional bandpass filters. These features were then fed into the Siamese Neural Network, which compared pairs of audio segments to calculate their similarity scores. The model was trained on labeled audio datasets, and we observed strong performance in clustering audio segments by speaker, achieving clear boundaries between different speakers.&lt;/p>
&lt;p>A report with the results can be found in the following &lt;a class="link" href="https://github.com/MatiasDiBernardo/Speaker-Diarization-with-SNN/blob/master/TP%20Final%20Seminario%20Redes%20-%20Di%20Bernardo%20Ferreyra.ipynb" target="_blank" rel="noopener"
>Jupyter notebook&lt;/a> (in Spanish).&lt;/p>
&lt;h3 id="pytorch-implementation-with-wav2vec">PyTorch Implementation with Wav2Vec
&lt;/h3>&lt;p>For this method, I utilized Wav2Vec, a powerful pre-trained model for extracting deep audio embeddings. Unlike SincNet, Wav2Vec embeddings are derived from self-supervised learning, capturing high-level representations of audio. These embeddings were used in the Siamese Neural Network for similarity comparisons. However, the results were suboptimal for the diarization task. It appears that Wav2Vec, while excellent for speech recognition tasks, lost some speaker-specific details necessary for distinguishing between speakers in our setup.&lt;/p>
&lt;h2 id="results">Results
&lt;/h2>&lt;p>The experiments demonstrated that the choice of feature extraction method is crucial for speaker diarization. The Keras implementation with SincNet outperformed the PyTorch implementation with Wav2Vec, showing higher accuracy in identifying speaker transitions. This suggests that task-specific feature extraction, like SincNet, is more effective than general-purpose embeddings like Wav2Vec for speaker diarization.&lt;/p>
&lt;p>The code for this project is available in this &lt;a class="link" href="https://github.com/MatiasDiBernardo/Speaker-Diarization-with-SNN" target="_blank" rel="noopener"
>repository&lt;/a>.&lt;/p>
&lt;h2 id="conclusions">Conclusions
&lt;/h2>&lt;p>This project was one of my first experiences with deep learning models, where I applied my knowledge to a problem without following a specific paper or using a pre-trained model. I explored different solutions and concluded on the importance of feature extraction and model selection.&lt;/p>
&lt;p>It also helped me become familiar with the syntax of the most popular deep learning frameworks and solidified my understanding in the process.&lt;/p></description></item></channel></rss>