Table of Contents
This is my pet project. It's a personal assistant written in python. It uses Ollama as an AI, Festival as TTS and the GUI is written with tkinter. You can chat with an AI both in text and in voice. There are custom voice-commands. And there is a coding assistant system where you can upload files for the AI to look at.
This program is only compatible with Linux and Mac YET.
You will need python 3.13 or higher installed.
Clone the Python Personal Assistant repo:
git clone https://github.com/Tavirutyutyu/PythonPersonalAssistant.gitThen to create a virtual environment (.venv) and install dependencies run the setup.sh script like this:
bash setup.sh Note: For the application to run it will also need an installed Ollama, downloaded AI model and installed Festival to work. BUT!!! The application will attempt to install them on its own on the first run. You will be able to see the process in the terminal. If there is any error with the installation of either ollama or festival only then try to install them manually.
Finally, you can run the project with this command when you are in the project root directory.
python3 main.pyI designed this application in a way so it's easy to add your own voice commands. You just need to know a little bit of python. And if you are a little bit bigger of a python master, you could even add your own AI or TTS service. To add your own command you need to create a json file to hold the keywords that can trigger your command, and sub_options if you have. For example to run the browser I have keywords like: [browse, open browser, open firefox...] and I have sub-options like: [google, youtube, github...] to open these sites in the browser. And if your_command.json is in the resources folder you can write the class for it in python. It goes into the commands/commands.py just on the bottom. Here is an example:
from commands import Command
class MyCommand(Command):
def __init__(self):
super().__init__(name="the name of your command", file_name="your_command.json")
def execute(self, text: str | None = None):
"""
Implement your solution here...
:param text: This is the chosen sub-option
:type text: str | None
"""
pass