Архив метки: звук

Python Генерация звуков через PyAudio

Следующий код генерирует и проигрывает звук:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Генерация звуков через pyaudio.

За основу взят https://medium.com/py-bits/sound-generation-python-904e54f5398d

sudo apt-get install python3-pyaudio
"""

import pyaudio
import math
PyAudio = pyaudio.PyAudio
BITRATE = 5000
FREQUENCY = 10000
LENGTH = 5
if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY + 100
NUMBER_OF_FRAMES = int(BITRATE * LENGTH)
WAVEDATA = ''
for x in range(NUMBER_OF_FRAMES):
    WAVEDATA = WAVEDATA + chr(
        int(
            math.sin(
                x
                / (
                    (
                        BITRATE / FREQUENCY
                    ) / math.pi
                )
            ) * 127 + 128
        )
    )
REST_FRAMES = NUMBER_OF_FRAMES % BITRATE
for x in range(REST_FRAMES):
    WAVEDATA = WAVEDATA + chr(128)
# print(WAVEDATA)
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$Þãèìð
# öùûýþþþþýüúø	õ
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$ÞãèìðÛ&Ö,Ð2Ê9Ã?¼FµN®U¦\lt|xph
# öùûýþþþþýüúø	õ
# ...
p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=2,
    rate=BITRATE,
    output=True
)
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

Регулировка громкости на Raspberry Pi через Bash

Разберёмся, как объяснить малинке через коммандную строку, с какой громкостью должен воспроизводиться звук. Самый простой способ — через псевдографическую программу alsamixer (вроде из пакета alsa-utils) — запускаем и двигаем ползунок вверх-вниз, соответственно регулируется громкость. Выход кнопкой Esc.

┌───────────────────────────── AlsaMixer v1.0.28 ──────────────────────────────┐
│ Card: bcm2835 ALSA                                   F1:  Help               │
│ Chip: Broadcom Mixer                                 F2:  System information │
│ View: F3:[Playback] F4: Capture  F5: All             F6:  Select sound card  │
│ Item: PCM [dB gain: -10.00]                          Esc: Exit               │
│                                                                              │
│                                                                              │
│                                     ┌──┐                                     │
│                                     │  │                                     │
│                                     │  │                                     │
│                                     │  │                                     │
│                                     │  │                                     │
│                                     │  │                                     │
│                                     │  │                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     │▒▒│                                     │
│                                     ├──┤                                     │
│                                     │OO│                                     │
│                                     └──┘                                     │
│                                      58                                      │
│                                  <  PCM   >                                  │
│                                                                              │
│                                                                              │
└──────────────────────────────────────────────────────────────────────────────┘

Для интерактивного режима alsamixer пойдёт, но для скрипта нет. Для скрипта нам подойдёт программа amixer. Используется так:

pi@kmsvsr-raspberrypi ~/usr/bin $ amixer cset numid=1 -- 400
numid=1,iface=MIXER,name='PCM Playback Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=-10239,max=400,step=0
  : values=400
  | dBscale-min=-102.39dB,step=0.01dB,mute=1

Здесь громкость регулируется последним числом, оно должно быть в интервале от -10239 (тишина) до 400 (на полную), при этом половина громкости соответствует примерно -1000.