Simple AI Sound Mixer in Python

If you’re looking for a fun and practical Raspberry Pi project, creating an AI-powered sound mixer using Python, Tkinter, and Pygame is a great choice. This project replaces the traditional soundpad with an AI-based approach that generates random sounds. It’s a perfect tool for experimenting with unique soundscapes, adding AI-generated effects to your music, or just having fun with sound synthesis. Best of all, it’s simple to set up and run.

What Are We Using?

We’re using a Raspberry Pi (or any Linux-based system) with Python and a few essential libraries. The interface is built with Tkinter, and sound generation is handled by a simple AI model using NumPy to create random waveforms, which are then played back using Pygame.

How Does It Work?

Instead of loading pre-existing sound files, this project generates synthetic audio using AI. The AI model uses random waveform synthesis to create unique, unpredictable soundscapes.

Required Libraries

To get started, install the required libraries if they are not already installed:

pip <span>install </span>pygame numpy tkinter
pip <span>install </span>pygame numpy tkinter
pip install pygame numpy tkinter

Enter fullscreen mode Exit fullscreen mode

Python Script for AI Sound Mixer

<span>import</span> <span>pygame</span>
<span>import</span> <span>tkinter</span> <span>as</span> <span>tk</span>
<span>from</span> <span>tkinter</span> <span>import</span> <span>Button</span><span>,</span> <span>messagebox</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>wave</span>
<span>import</span> <span>os</span>
<span># Initialize pygame mixer </span><span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>init</span><span>(</span><span>frequency</span><span>=</span><span>44100</span><span>,</span> <span>size</span><span>=-</span><span>16</span><span>,</span> <span>channels</span><span>=</span><span>2</span><span>,</span> <span>buffer</span><span>=</span><span>512</span><span>)</span>
<span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>set_num_channels</span><span>(</span><span>12</span><span>)</span>
<span># Function to generate a random sound </span>
<span>def</span> <span>generate_random_sound</span><span>(</span><span>duration</span><span>=</span><span>1.0</span><span>,</span> <span>sample_rate</span><span>=</span><span>44100</span><span>):</span>
<span>t</span> <span>=</span> <span>np</span><span>.</span><span>linspace</span><span>(</span><span>0</span><span>,</span> <span>duration</span><span>,</span> <span>int</span><span>(</span><span>sample_rate</span> <span>*</span> <span>duration</span><span>),</span> <span>False</span><span>)</span>
<span>wave_data</span> <span>=</span> <span>np</span><span>.</span><span>sin</span><span>(</span><span>2</span> <span>*</span> <span>np</span><span>.</span><span>pi</span> <span>*</span> <span>np</span><span>.</span><span>random</span><span>.</span><span>uniform</span><span>(</span><span>100</span><span>,</span> <span>1000</span><span>)</span> <span>*</span> <span>t</span><span>)</span> <span>*</span> <span>32767</span>
<span>wave_data</span> <span>=</span> <span>wave_data</span><span>.</span><span>astype</span><span>(</span><span>np</span><span>.</span><span>int16</span><span>)</span>
<span>file_name</span> <span>=</span> <span>"</span><span>temp_sound.wav</span><span>"</span>
<span>with</span> <span>wave</span><span>.</span><span>open</span><span>(</span><span>file_name</span><span>,</span> <span>"</span><span>w</span><span>"</span><span>)</span> <span>as</span> <span>wf</span><span>:</span>
<span>wf</span><span>.</span><span>setnchannels</span><span>(</span><span>1</span><span>)</span>
<span>wf</span><span>.</span><span>setsampwidth</span><span>(</span><span>2</span><span>)</span>
<span>wf</span><span>.</span><span>setframerate</span><span>(</span><span>sample_rate</span><span>)</span>
<span>wf</span><span>.</span><span>writeframes</span><span>(</span><span>wave_data</span><span>.</span><span>tobytes</span><span>())</span>
<span>return</span> <span>file_name</span>
<span># Function to play a generated sound </span><span>def</span> <span>play_sound</span><span>():</span>
<span>sound_file</span> <span>=</span> <span>generate_random_sound</span><span>()</span>
<span>sound</span> <span>=</span> <span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>Sound</span><span>(</span><span>sound_file</span><span>)</span>
<span>channel</span> <span>=</span> <span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>find_channel</span><span>()</span>
<span>if</span> <span>channel</span><span>:</span>
<span>channel</span><span>.</span><span>play</span><span>(</span><span>sound</span><span>)</span>
<span>os</span><span>.</span><span>remove</span><span>(</span><span>sound_file</span><span>)</span> <span># Clean up after playing </span>
<span># Function to confirm exit </span><span>def</span> <span>confirm_exit</span><span>():</span>
<span>if</span> <span>messagebox</span><span>.</span><span>askyesno</span><span>(</span><span>"</span><span>Exit</span><span>"</span><span>,</span> <span>"</span><span>Are you sure you want to exit?</span><span>"</span><span>):</span>
<span>root</span><span>.</span><span>destroy</span><span>()</span>
<span># Create GUI </span><span>root</span> <span>=</span> <span>tk</span><span>.</span><span>Tk</span><span>()</span>
<span>root</span><span>.</span><span>title</span><span>(</span><span>"</span><span>AI Sound Mixer</span><span>"</span><span>)</span>
<span>root</span><span>.</span><span>geometry</span><span>(</span><span>"</span><span>600x400</span><span>"</span><span>)</span>
<span># Create button for generating sounds </span><span>play_btn</span> <span>=</span> <span>Button</span><span>(</span><span>root</span><span>,</span> <span>text</span><span>=</span><span>"</span><span>Generate Sound</span><span>"</span><span>,</span> <span>font</span><span>=</span><span>(</span><span>"</span><span>Arial</span><span>"</span><span>,</span> <span>18</span><span>),</span> <span>width</span><span>=</span><span>20</span><span>,</span> <span>height</span><span>=</span><span>5</span><span>,</span> <span>command</span><span>=</span><span>play_sound</span><span>)</span>
<span>play_btn</span><span>.</span><span>pack</span><span>(</span><span>pady</span><span>=</span><span>20</span><span>)</span>
<span># Exit button </span><span>exit_btn</span> <span>=</span> <span>Button</span><span>(</span><span>root</span><span>,</span> <span>text</span><span>=</span><span>"</span><span>Exit</span><span>"</span><span>,</span> <span>font</span><span>=</span><span>(</span><span>"</span><span>Arial</span><span>"</span><span>,</span> <span>18</span><span>),</span> <span>width</span><span>=</span><span>20</span><span>,</span> <span>height</span><span>=</span><span>5</span><span>,</span> <span>command</span><span>=</span><span>confirm_exit</span><span>)</span>
<span>exit_btn</span><span>.</span><span>pack</span><span>(</span><span>pady</span><span>=</span><span>20</span><span>)</span>
<span># Run the application </span><span>root</span><span>.</span><span>mainloop</span><span>()</span>
<span>import</span> <span>pygame</span>
<span>import</span> <span>tkinter</span> <span>as</span> <span>tk</span>
<span>from</span> <span>tkinter</span> <span>import</span> <span>Button</span><span>,</span> <span>messagebox</span>
<span>import</span> <span>numpy</span> <span>as</span> <span>np</span>
<span>import</span> <span>wave</span>
<span>import</span> <span>os</span>

<span># Initialize pygame mixer </span><span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>init</span><span>(</span><span>frequency</span><span>=</span><span>44100</span><span>,</span> <span>size</span><span>=-</span><span>16</span><span>,</span> <span>channels</span><span>=</span><span>2</span><span>,</span> <span>buffer</span><span>=</span><span>512</span><span>)</span>
<span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>set_num_channels</span><span>(</span><span>12</span><span>)</span>

<span># Function to generate a random sound </span>
<span>def</span> <span>generate_random_sound</span><span>(</span><span>duration</span><span>=</span><span>1.0</span><span>,</span> <span>sample_rate</span><span>=</span><span>44100</span><span>):</span>
    <span>t</span> <span>=</span> <span>np</span><span>.</span><span>linspace</span><span>(</span><span>0</span><span>,</span> <span>duration</span><span>,</span> <span>int</span><span>(</span><span>sample_rate</span> <span>*</span> <span>duration</span><span>),</span> <span>False</span><span>)</span>
    <span>wave_data</span> <span>=</span> <span>np</span><span>.</span><span>sin</span><span>(</span><span>2</span> <span>*</span> <span>np</span><span>.</span><span>pi</span> <span>*</span> <span>np</span><span>.</span><span>random</span><span>.</span><span>uniform</span><span>(</span><span>100</span><span>,</span> <span>1000</span><span>)</span> <span>*</span> <span>t</span><span>)</span> <span>*</span> <span>32767</span>
    <span>wave_data</span> <span>=</span> <span>wave_data</span><span>.</span><span>astype</span><span>(</span><span>np</span><span>.</span><span>int16</span><span>)</span>

    <span>file_name</span> <span>=</span> <span>"</span><span>temp_sound.wav</span><span>"</span>
    <span>with</span> <span>wave</span><span>.</span><span>open</span><span>(</span><span>file_name</span><span>,</span> <span>"</span><span>w</span><span>"</span><span>)</span> <span>as</span> <span>wf</span><span>:</span>
        <span>wf</span><span>.</span><span>setnchannels</span><span>(</span><span>1</span><span>)</span>
        <span>wf</span><span>.</span><span>setsampwidth</span><span>(</span><span>2</span><span>)</span>
        <span>wf</span><span>.</span><span>setframerate</span><span>(</span><span>sample_rate</span><span>)</span>
        <span>wf</span><span>.</span><span>writeframes</span><span>(</span><span>wave_data</span><span>.</span><span>tobytes</span><span>())</span>

    <span>return</span> <span>file_name</span>

<span># Function to play a generated sound </span><span>def</span> <span>play_sound</span><span>():</span>
    <span>sound_file</span> <span>=</span> <span>generate_random_sound</span><span>()</span>
    <span>sound</span> <span>=</span> <span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>Sound</span><span>(</span><span>sound_file</span><span>)</span>
    <span>channel</span> <span>=</span> <span>pygame</span><span>.</span><span>mixer</span><span>.</span><span>find_channel</span><span>()</span>
    <span>if</span> <span>channel</span><span>:</span>
        <span>channel</span><span>.</span><span>play</span><span>(</span><span>sound</span><span>)</span>
    <span>os</span><span>.</span><span>remove</span><span>(</span><span>sound_file</span><span>)</span>  <span># Clean up after playing </span>
<span># Function to confirm exit </span><span>def</span> <span>confirm_exit</span><span>():</span>
    <span>if</span> <span>messagebox</span><span>.</span><span>askyesno</span><span>(</span><span>"</span><span>Exit</span><span>"</span><span>,</span> <span>"</span><span>Are you sure you want to exit?</span><span>"</span><span>):</span>
        <span>root</span><span>.</span><span>destroy</span><span>()</span>

<span># Create GUI </span><span>root</span> <span>=</span> <span>tk</span><span>.</span><span>Tk</span><span>()</span>
<span>root</span><span>.</span><span>title</span><span>(</span><span>"</span><span>AI Sound Mixer</span><span>"</span><span>)</span>
<span>root</span><span>.</span><span>geometry</span><span>(</span><span>"</span><span>600x400</span><span>"</span><span>)</span>

<span># Create button for generating sounds </span><span>play_btn</span> <span>=</span> <span>Button</span><span>(</span><span>root</span><span>,</span> <span>text</span><span>=</span><span>"</span><span>Generate Sound</span><span>"</span><span>,</span> <span>font</span><span>=</span><span>(</span><span>"</span><span>Arial</span><span>"</span><span>,</span> <span>18</span><span>),</span> <span>width</span><span>=</span><span>20</span><span>,</span> <span>height</span><span>=</span><span>5</span><span>,</span> <span>command</span><span>=</span><span>play_sound</span><span>)</span>
<span>play_btn</span><span>.</span><span>pack</span><span>(</span><span>pady</span><span>=</span><span>20</span><span>)</span>

<span># Exit button </span><span>exit_btn</span> <span>=</span> <span>Button</span><span>(</span><span>root</span><span>,</span> <span>text</span><span>=</span><span>"</span><span>Exit</span><span>"</span><span>,</span> <span>font</span><span>=</span><span>(</span><span>"</span><span>Arial</span><span>"</span><span>,</span> <span>18</span><span>),</span> <span>width</span><span>=</span><span>20</span><span>,</span> <span>height</span><span>=</span><span>5</span><span>,</span> <span>command</span><span>=</span><span>confirm_exit</span><span>)</span>
<span>exit_btn</span><span>.</span><span>pack</span><span>(</span><span>pady</span><span>=</span><span>20</span><span>)</span>

<span># Run the application </span><span>root</span><span>.</span><span>mainloop</span><span>()</span>
import pygame import tkinter as tk from tkinter import Button, messagebox import numpy as np import wave import os # Initialize pygame mixer pygame.mixer.init(frequency=44100, size=-16, channels=2, buffer=512) pygame.mixer.set_num_channels(12) # Function to generate a random sound def generate_random_sound(duration=1.0, sample_rate=44100): t = np.linspace(0, duration, int(sample_rate * duration), False) wave_data = np.sin(2 * np.pi * np.random.uniform(100, 1000) * t) * 32767 wave_data = wave_data.astype(np.int16) file_name = "temp_sound.wav" with wave.open(file_name, "w") as wf: wf.setnchannels(1) wf.setsampwidth(2) wf.setframerate(sample_rate) wf.writeframes(wave_data.tobytes()) return file_name # Function to play a generated sound def play_sound(): sound_file = generate_random_sound() sound = pygame.mixer.Sound(sound_file) channel = pygame.mixer.find_channel() if channel: channel.play(sound) os.remove(sound_file) # Clean up after playing # Function to confirm exit def confirm_exit(): if messagebox.askyesno("Exit", "Are you sure you want to exit?"): root.destroy() # Create GUI root = tk.Tk() root.title("AI Sound Mixer") root.geometry("600x400") # Create button for generating sounds play_btn = Button(root, text="Generate Sound", font=("Arial", 18), width=20, height=5, command=play_sound) play_btn.pack(pady=20) # Exit button exit_btn = Button(root, text="Exit", font=("Arial", 18), width=20, height=5, command=confirm_exit) exit_btn.pack(pady=20) # Run the application root.mainloop()

Enter fullscreen mode Exit fullscreen mode

How It Works

  • The AI model generates a random waveform with a frequency between 100Hz and 1000Hz.
  • The waveform is saved as a temporary WAV file.
  • The sound is played using Pygame’s mixer.
  • The temporary sound file is deleted after playback to keep things clean.

This project is an exciting way to experiment with AI-generated sounds while building a fun and interactive Python application. Try modifying the waveform generation to create different types of sounds!

原文链接:Simple AI Sound Mixer in Python

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
The course of true love never did run smooth.
真诚的爱情之路永不会是平坦的
评论 抢沙发

请登录后发表评论

    暂无评论内容