добавь UI от kivy, добавь кнопки с командами: 
import sys
import re  # Для обработки строковых символов

def safe_print(text):
    try:
        print(text.encode('utf-8').decode('cp1252'))
    except UnicodeEncodeError:
        print(text.encode('utf-8').decode('utf-8'))





import os
import time
import speech_recognition as sr
import pyttsx3
import yt_dlp as youtube_dl
import pygame
import imageio_ffmpeg as ffmpeg
from freeGPT import Client
from googletrans import Translator
import re  # Для обработки строковых символов

# Проверка, запущено ли приложение на Android
try:
    from android.permissions import request_permissions, Permission
    from android import api_version

    android_platform = True
except ImportError:
    android_platform = False

def safe_print(text):
    try:
        print(text)
    except UnicodeEncodeError:
        print(text.encode('utf-8').decode('utf-8'))

def speak(text):
    engine = pyttsx3.init()
    engine.say(text)
    engine.runAndWait()

# Инициация распознавания речи
recognizer = sr.Recognizer()

def listen_command():
    with sr.Microphone() as source:
        safe_print("Listening for command…")
        audio = recognizer.listen(source)
        try:
            command = recognizer.recognize_google(audio, language="ru-RU")
            safe_print(f"Command heard: {command}")
            return command.lower()
        except sr.UnknownValueError:
            # Если музыка не играет, произнесем сообщение об ошибке
            if not pygame.mixer.music.get_busy():
                speak("Я не понял ваш запрос")
            return ""
        except sr.RequestError:
            # Если музыка не играет, произнесем сообщение об ошибке
            if not pygame.mixer.music.get_busy():
                speak("Ошибка сервиса распознавания речи")
            return ""

# Функция для удаления недопустимых символов из имени файла
def sanitize_filename(filename):
    return re.sub(r'[/*?:"<>|]', '', filename)

# Функция для поиска на YouTube и скачивания аудио
def search_youtube(query):
    sanitized_query = sanitize_filename(query)
    directory = "mp3"

    # Создание директории, если она не существует
    if not os.path.exists(directory):
        os.makedirs(directory)

    youtube_dl_opts = {
        'format': 'bestaudio/best',
        'noplaylist': True,
        'quiet': True,
        'outtmpl': os.path.join(directory, f'{sanitized_query}.%(ext)s'),
        'ffmpeg_location': ffmpeg.get_ffmpeg_exe(),
        'postprocessors': [{
            'key': 'FFmpegExtractAudio',
            'preferredcodec': 'mp3',
            'preferredquality': '192',
        }],
    }

    file_path = os.path.join(directory, f"{sanitized_query}.mp3")
    safe_print(f"File path: {file_path}")

    if os.path.exists(file_path):
        speak(f"Файл уже существует. Проигрываю {sanitized_query}.")
        return file_path

    with youtube_dl.YoutubeDL(youtube_dl_opts) as ydl:
        info = ydl.extract_info("ytsearch1:" + query, download=False)
        video_info = info['entries'][0]

        # safe_print(f"Video Info: {video_info}")

        ydl.download(["ytsearch1:" + query])
        title = sanitize_filename(video_info['title'])
        while not os.path.exists(file_path):
            time.sleep(1)
        return file_path

# Функция регулировки громкости
def set_volume(level):
    try:
        level = int(level)
        if 0 <= level <= 10:
            pygame.mixer.music.set_volume(level / 10.0)
            speak(f"Громкость установлена на {level}")
        else:
            speak("Пожалуйста, укажите уровень громкости от 0 до 10.")
    except ValueError:
        speak("Я не понял уровень громкости, укажите значение от 0 до 10.")

# Функция для вывода доступных команд
def list_commands():
    commands = [
        "песню или музыку - для поиска и воспроизведения песни",
        "продолжай - для продолжения воспроизведения",
        "пауза - для паузы воспроизведения",
        "стоп - для остановки воспроизведения и удаления песни",
        "включи - для воспроизведения песни",
        "найди или найти - для поиска новой песни",
        "перестань слушать или не слушай - для прекращения слушать команды",
        "слушай - для возобновления слушания команд",
        "громкость - от нуля до десяти",
        "команды - для воспроизведения этого списка команд",
        "спасибо, выход или завершить - для завершения программы"
    ]
    speak("Доступные команды: " + ", ".join(commands))

# Функция для запроса к GPT
def get_gpt_response(query):
    translator = Translator()
    try:
        # Переводим запрос на английский язык
        translated_query = translator.translate(query, src='ru', dest='en').text
        # Отправляем запрос в FreeGPT
        resp = Client.create_completion("gpt3", translated_query)
        # Переводим ответ на русский язык
        translated_resp = translator.translate(resp, src='en', dest='ru').text
        return translated_resp
    except Exception as e:
        return f"Произошла ошибка: {e}"

# Словарь для перевода текстовых чисел в числовые значения
text_to_number = {
    "ноль": 0, "один": 1, "два": 2, "три": 3, "четыре": 4, "пять": 5,
    "шесть": 6, "семь": 7, "восемь": 8, "девять": 9, "десять": 10
}

# Функция для получения числового значения из текста
def get_number_from_text(text):
    return text_to_number.get(text.lower(), None)

# Главная функция
def main():
    pygame.init()
    pygame.mixer.init()

    # Запрашиваем разрешения, если приложение запущено на Android
    if android_platform:
        def callback(permissions, results):
            if all(results):
                safe_print("Permissions granted")
            else:
                safe_print("Permissions denied")
                speak("Приложению необходимы все разрешения для корректной работы.")
                return

        if api_version >= 23:
            permissions_to_request = [Permission.READ_EXTERNAL_STORAGE,
                                      Permission.WRITE_EXTERNAL_STORAGE,
                                      Permission.RECORD_AUDIO]
            request_permissions(permissions_to_request, callback)
        else:
            safe_print("Permissions granted by default (API < 23)")

    speak("Приветствую! Что вы хотите найти?")

    current_song = None
    listening = True

    while True:
        if not listening:
            command = listen_command()
            if "слушай" in command:
                speak("Я снова слушаю.")
                listening = True
            else:
                continue

        command = listen_command()

        if "перестань слушать" in command or "не слушай" in command:
            speak("Я перестаю слушать. Скажите 'Слушай', чтобы я снова начал слушать.")
            listening = False
            continue

        if "команды" in command:
            list_commands()

        elif "песню" in command or "песня" in command or "музыку" in command or "музыка" in command or "youtube" in command:
            speak("Какую песню вы хотите услышать?")
            search_query = listen_command()
            safe_print(f"Search Query: {search_query}")

            if search_query:
                song_path = search_youtube(search_query)
                safe_print(f"Song Path: {song_path}")
                if song_path and os.path.exists(song_path):
                    if current_song:
                        pygame.mixer.music.stop()
                        while pygame.mixer.music.get_busy():
                            time.sleep(0.1)
                        if os.path.exists(current_song):
                            os.remove(current_song)
                    current_song = song_path
                    pygame.mixer.music.load(current_song)
                    pygame.mixer.music.play()
                    speak(f"Проигрываю песню '{search_query}'")
                else:
                    speak("Не удалось найти песню.")

        elif "продолжай" in command:
            if current_song and not pygame.mixer.music.get_busy():
                pygame.mixer.music.unpause()

        elif "пауза" in command:
            if current_song and pygame.mixer.music.get_busy():
                pygame.mixer.music.pause()

        elif "стоп" in command:
            if current_song:
                pygame.mixer.music.stop()
                # Дождитесь остановки воспроизведения, чтобы освободить файл
                while pygame.mixer.music.get_busy():
                    time.sleep(0.1)
                if os.path.exists(current_song):
                    os.remove(current_song)
                current_song = None

        elif "включи" in command:
            if current_song:
                pygame.mixer.music.play()

        elif "найди" in command or "найти" in command:
            if current_song:
                pygame.mixer.music.stop()
                while pygame.mixer.music.get_busy():
                    time.sleep(0.1)
                if os.path.exists(current_song):
                    os.remove(current_song)
                current_song = None

            speak("Что вы хотите найти?")
            search_query = listen_command()
            safe_print(f"Search Query: {search_query}")

            if search_query:
                song_path = search_youtube(search_query)
                safe_print(f"Song Path: {song_path}")
                if song_path and os.path.exists(song_path):
                    current_song = song_path
                    pygame.mixer.music.load(current_song)
                    pygame.mixer.music.play()
                    speak(f"Проигрываю песню '{search_query}'")
                else:
                    speak("Не удалось найти песню.")

        elif "громкость" in command:
            parts = command.split()
            if len(parts) > 1:
                number_word = parts[1]
                level = get_number_from_text(number_word)
                if level is not None:
                    set_volume(level)
                else:
                    speak("Пожалуйста, укажите уровень громкости от 0 до 10.")
            else:
                speak("Пожалуйста, укажите уровень громкости от 0 до 10.")

        elif "спасибо" in command or "выход" in command or "завершить" in command:
            speak("Завершаю работу. До свидания!")
            break

        else:
            gpt_response = get_gpt_response(command)
            speak(gpt_response)

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        pass
    finally:
        pygame.quit()