Воспроизведение короткого звука из памяти в Python 3

Вопрос или проблема

Мне нужно иметь возможность воспроизводить короткие (<3с) звуки из блобов, закодированных в mp3, хранящихся в базе данных sqlite3.

В настоящее время я работаю под Linux, но кроссплатформенное решение было бы приветствовано.

Мне не нужно контролировать звук (т.е. не нужно останавливать, ставить на паузу и т.д.), но я должен знать, когда звук закончился; подходящей была бы функция, принимающая блоб в памяти и возвращающая, когда воспроизведение завершено.

Я также не хочу, чтобы открывались окна (это должно работать из командной строки).

Я не хочу записывать блоб в файл, и это, похоже, исключает такие вещи, как pygame и playsound.

Буду признателен за помощь.

Ответ или решение

Для воспроизведения коротких звуков из mp3-блобов, хранящихся в SQLite3 базе данных, предлагаю подход на основе библиотеки pydub в сочетании с simpleaudio. Это решение подходит для использования в средах Linux и является кроссплатформенным. С помощью этого подхода вы сможете избежать открытия окон и не будете сохранять блобы в файлы, что соответствует вашим требованиям.

Установка необходимых библиотек

Перед началом работы убедитесь, что у вас установлены необходимые библиотеки. Используйте команды:

pip install pydub simpleaudio
sudo apt-get install ffmpeg   # для работы с mp3

Пример кода

Вот пример функции, которая принимает mp3-блоб, загружает его в память и воспроизводит звук. Функция будет блокирующей, что означает, что она завершится только после окончания воспроизведения звука.

import sqlite3
from pydub import AudioSegment
import simpleaudio as sa
import io

def play_sound_from_blob(blob):
    # Загрузка mp3 из blob
    audio_segment = AudioSegment.from_file(io.BytesIO(blob), format='mp3')

    # Преобразование в формат, подходящий для воспроизведения
    playback = audio_segment.raw_data
    sample_rate = audio_segment.frame_rate
    num_channels = audio_segment.channels
    sample_width = audio_segment.sample_width

    # Создание объекта Wave для воспроизведения
    audio = sa.WaveObject(playback, num_channels, sample_width, sample_rate)

    # Воспроизведение
    play_sound = audio.play()
    play_sound.wait_done()  # Дождаться завершения воспроизведения

# Пример использования
def get_blob_from_db(db_path, sound_id):
    # Открытие базы данных и извлечение blob звука
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()

    cursor.execute("SELECT sound_blob FROM sounds WHERE id=?", (sound_id,))
    blob = cursor.fetchone()[0]

    conn.close()
    return blob

# Используйте указанные функции для воспроизведения звука
if __name__ == "__main__":
    db_path = 'sounds.db'  # Путь к вашей базе данных
    sound_id = 1  # ID звука, который хотите воспроизвести
    sound_blob = get_blob_from_db(db_path, sound_id)
    play_sound_from_blob(sound_blob)

Объяснение кода

  1. Импорт необходимых библиотек: Мы используем sqlite3 для работы с базой данных, pydub для обработки mp3-звуков и simpleaudio для воспроизведения аудио.

  2. Функция play_sound_from_blob:

    • Принимает блоб аудио в формате mp3.
    • Загружает его с помощью pydub в память.
    • Преобразует его в формат, необходимый для simpleaudio.
    • Воспроизводит звук и блокирует выполнение программы до завершения воспроизведения.
  3. Функция get_blob_from_db:

    • Устанавливает соединение с базой данных SQLite.
    • Извлекает блоб аудиофайла по ID.
    • Закрывает подключение к базе данных после получения блоба.

Заключение

Это решение позволяет вам эффективно воспроизводить короткие звуки из блобов в базе данных без создания временных файлов или графического интерфейса. Благодаря использованию pydub и simpleaudio вы получите кроссплатформенное решение, соответствующее вашим требованиям. Если у вас возникнут вопросы или проблемы, не стесняйтесь обращаться за помощью.

Оцените материал
Добавить комментарий

Капча загружается...