Я хотел бы использовать звуковой сигнал в сценарии оболочки. К сожалению, ни один из методов, которые я нашел через Google, не работает для меня.
Я попытался
echo -e '\a'
echo -ne '\007'
и команду beep
после того, как я установил его через apt.
В чем может быть причина?
Сначала запустите sudo modprobe pcspkr
, а затем должен сработать звуковой сигнал
.
Причина этого не в том, что по умолчанию Ubuntu больше не загружает драйвер аппаратуры, который издаёт звуковые сигналы.
Если это работает, то для того, чтобы включить загрузку pcspkr, необходимо постоянно редактировать файл /etc/modprobe.d/blacklist.conf
(возможно, используя gksudo gedit
) и закомментировать строку с надписью blacklist pcspkr
, чтобы выглядело так:
# ugly and loud noise, getting on everyone's nerves; this should be done by a # nice pulseaudio bing (Ubuntu: #77010) # blacklist pcspkr
Не являясь поклонником pcspkr-бипа, я использую звуковой сигнал из одного из системных звуков с установленной командой pulseaudio server's paplay.
Сначала найдите понравившийся вам звук (например, вы можете просмотреть /usr/share/sounds) и создайте ссылку на него
export BEEP=/usr/share/sounds/ubuntu/ringtones/Harmonics.ogg
Затем, чтобы он был доступен в виде команды
alias beep='paplay $BEEP'
Теперь просто запустите beep
, когда вам это понадобится. Например, чтобы предупредить Вас о завершении команды:
find . | grep treasure ; beep
Для постоянного решения этой проблемы:
gconf-editor
и если рабочий стол | гном | периферийные устройства | клавиатура | Параметр bell_mode
присутствует, измените его с выкл
на на
dconf-editor
и если org | гном | настройки-демон | периферийные устройства | клавиатура | присутствует параметр режима звонка
, затем измените его с выкл
на на
pactl upload-sample / usr / share / звуки / gnome / default / alerts / glass .ogg bell.ogg
в файл ~ / .xprofile
(вам понадобится gnome-control-center-data
для glass.ogg
) ["$ DISPLAY"] && xset b 100
в файл ~ / .bashrc
Самый простой способ активировать это решение - перезагрузить компьютер.
Далее, чтобы реализовать это решение для уже открытого окна терминала, запустите команду pactl
и запустите команду xset
в соответствующем окне терминала.
Поскольку это вопрос с очень высокой оценкой в Google, я добавлю шаги, которые я сделал, чтобы повторно включить звуковой сигнал как в консоли, так и в X11:
As уже ответил , драйвер ядра pcspkr
для динамика ПК занесен в черный список Ubuntu.
Временно включить до перезагрузки:
sudo modprobe pcspkr
Автоматически включать при загрузке:
sudo nano /etc/modprobe.d/blacklist.conf
(удалите или закомментируйте строку pcspkr
, добавив к ней #
)
gnome-terminal
) В X, например, при использовании Unity, KDE, Gnome Shell, события звуковых сигналов фиксируются PulseAudio благодаря module-x11-bell
, который по умолчанию загружается в / usr / bin / start-pulseaudio-x11
. И образец звука, который PulseAudio воспроизводит при звуковом сигнале, bell.ogg
по умолчанию пуст. Кроме того, громкость звонка может быть отключена.
Чтобы временно включить для текущего сеанса,
xset b 100 # perhaps not needed, on my system it was 40 by default
pactl upload-sample /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg
Есть другие подходящие образцы, которые вы можете попробовать в / usr / share / звуки
, например, проверьте их на / usr / share / Sounds / gnome / default / alerts /
Обратите внимание, что программа beep
на самом деле не нужна. Но если он установлен, он использует динамик ПК. Это был единственный способ включить зуммер в X:
sudo apt-get install beep
Для автоматического включения при загрузке просто добавьте приведенные выше строки в свой ~ / .profile
или общесистемный в / etc / profile
Чтобы проверить это:
printf '\a'
Beep!
beep
Buzz!
Я уже сталкивался с этой проблемой раньше. Насколько я помню, проблема в том, что звонок терминала пытается позвонить во внутренний динамик компьютера (как на настольном компьютере старой школы), но в ноутбуках и некоторых более новых компьютерах этого не хватает.
Единственное решение, которое я нашел в время было до
sudo apt-get install sox
и
play -n synth <duration in seconds> sine <freq in Hz> vol <volume (0-1)>
например
play -n synth 0.1 sine 880 vol 0.5
Если у вас есть реальные колонки, подключенные к компьютеру, и вы не получаете звуковой сигнал, то это скорее всего из-за того, что вы используете композит. Compiz полагается на то, что импульсный звук перехватывает звуковые сигналы и проигрывает их, в то время как метрополитен обходит обычную установку и использует либканберру для проигрывания звукового сигнала. Если она работает с метассивом, а не с композитом, то это ваша проблема, иначе ответ htorque будет corrent.
Насколько я могу судить, это ошибка: Системный звуковой сигнал в Кармиче сломан, несмотря на героические попытки его исправить .
Я наконец нашел решение, которое не требует, чтобы alsamixer
имел опцию PC Beep. Думаю, я помню все свои изменения:
раскомментируйте следующее в /etc/pulse/default.pa
:
load-sample-lazy x11-bell /usr/share/sounds/ubuntu/stereo/bell.ogg
load-module module-x11-bell sample=bell-windowing-system
за эту ошибку , запустите pactl upload- пример /usr/share/sounds/ubuntu/stereo/bell.ogg bell.ogg
Альтернативный подход - установите xterm / console на «Visual Bell», чтобы, когда он издал звуковой сигнал, window просто инвертирует свои цвета на короткое время.
У меня есть функция bash под названием beep, которая привлекает мое внимание после завершения команды.
beep () { while true; do echo -en '\a'; sleep 1; done }
И она используется таким образом
longrun-command ; beep
" Звуковой сигнал может работать только в том случае, если на вашем ПК есть традиционный" динамик "старого стиля , и, вероятно, у большинства, если не у всех ноутбуков и небольших устройств его нет.
Однако вместо этого у них часто есть звуковой чип и один или несколько динамиков, которые можно использовать для воспроизведения любого звука.
Итак, устаревшие советуют установить команду beep
и / или модуль ядра pcspkr
никогда не будет работать тихо, если у вас нет старого оборудования для динамиков.
INSTEAD: Попробуйте воспроизвести такой звук, когда вам нужен звуковой сигнал:
paplay /usr/share/sounds/sound-icons/capital
Обратите внимание, что здесь используется команда paplay
( P ulse A udio Play ), которая лучше сочетается со звуками другого уровня пользователя (приложение пользователя). в вашей системе, а не более старую команду aplay
( A LSA Play ), которая обычно может воспроизводить только один звук одновременно. Но учтите, что PulseAudio вызывает ALSA для фактического воспроизведения звука.
Мое предыдущее предложение использовать play
все еще может работать, но запуск SoX, из которого происходит воспроизведение, является излишним.
Работает для меня, когда все остальное не удалось. Выражаем благодарность: tredegar & hk_centos и другим.
Это может быть слишком поздно, НО для парня, который в будущем ищет это:
printf '\x07'
Сегодня, июнь 2020 года , в Ubuntu 18.04 , весь sudo modprobe pcspkr
и комментарии из черного списка pcspkr
части /etc/modprobe.d/blacklist.conf
файл,, как описано здесь , кажется необязательным.
Мой все еще находится в черном списке, но звук моего звонка работает нормально!
$cat /etc/modprobe.d/blacklist.conf
.
.
.
# ugly and loud noise, getting on everyone's nerves; this should be done by a
# nice pulseaudio bing (Ubuntu: #77010)
blacklist pcspkr
Вместо этого просто убедитесь, что Терминальный звонок звук включен в настройках gnome-terminal
:
Щелкните правой кнопкой мыши на экране в gnome-terminal
-> Настройки -> установите флажок " Терминальный звонок »в разделе« Звук », как показано ниже:
Теперь запустите это и услышите глухой« глухой »звук символа звонка:
echo -e "\a"
Это также работает в удаленных сеансах ssh, которые очень удобно, например, при сборке на удаленном компьютере, так что он будет воспроизводить звук колокольчика, когда сборка будет завершена, чтобы предупредить вас:
time bazel build //...; echo -e "\a"
Обратите внимание, что также нажатие Backspace , когда нечего удалять также будет воспроизводить этот звук в gnome-terminal
.
Я добавил эту небольшую функцию в свой .bashrc вместо beep:
beep () {
if [ "$1" = --list ]
then
find /usr/share/sounds -type f -exec basename {} \; | sort -n | tr '\n' ' '; echo
else
paplay $(find /usr/share/sounds -type f -iname "${1:-bell}*" | head -1)
fi
}
Он ищет файл в / usr / share / звуки, начиная с предоставил аргумент или "звонок" и проиграл его. beep --list
возвращает список файлов в /usr/share/sounds.[12222pting
Некоторые материнские платы не имеют звукового динамика. Чтобы обойти это, я создал сценарий на Python, который вместо этого использует фильтр FFmpeg aevalsrc
для генерации звуковых сигналов.
Примечание: вам нужно установить FFmpeg, используя sudo apt install ffmpeg
#!/usr/bin/env python3
# This program runs FFPlay to generate beeps.
from argparse import ArgumentParser, ArgumentError, Action
import re
import subprocess
# Custom action for note
class NoteToFrequencyAction(Action):
_note = re.compile(r"([A-G])(bb|[bx#])?(\d+)")
_note_factors = {
"C": lambda x: x / (2 ** (9/12)),
"D": lambda x: x / (2 ** (7/12)),
"E": lambda x: x / (2 ** (5/12)),
"F": lambda x: x / (2 ** (4/12)),
"G": lambda x: x / (2 ** (2/12)),
"A": lambda x: x,
"B": lambda x: x * (2 ** (2/12)),
}
_accidental_factors = {
"x" : lambda x: x * (2 ** (2/12)),
"#" : lambda x: x * (2 ** (1/12)),
None: lambda x: x,
"b" : lambda x: x / (2 ** (1/12)),
"bb": lambda x: x / (2 ** (2/12))
}
def __call__(self, parser, namespace, values, option_string) -> None:
if not (isinstance(values, str)):
raise ArgumentError("Should not have multiple values")
parse = self._note.fullmatch(values);
parts = parse.groups()
freq = 440.0
freq *= 2 ** (int(parts[2]) - 4)
freq = self._note_factors[parts[0]](freq)
freq = self._accidental_factors[parts[1]](freq)
if not type(namespace.__dict__[self.dest]) == list:
namespace.__dict__[self.dest] = []
namespace.__dict__[self.dest].append(freq)
parser = ArgumentParser()
freq_group = parser.add_mutually_exclusive_group(required=True)
freq_group.add_argument("-f", "--frequency", type=float, action="append", dest="freqs",
help="Can be specified more than once, specifies frequencies in Hz of the beeped notes"
)
freq_group.add_argument("-n", "--note", action=NoteToFrequencyAction, dest="freqs",
help="Can be specified more than once, specifies notes (e.g. A4). You can use b, #, x, bb for accidentals."
)
parser.add_argument("-d", "--duration", type=float, default=1, dest="time",
help="The duration of the beep in seconds."
)
parser.add_argument("-v", "--volume", type=float, default=0.5,
help="The volume of the beep, defaults to 0.5"
)
args = parser.parse_args()
del parser, freq_group
aevalsrc_waves = [f"sgn(sin({repr(f)}*2*PI*t))" for f in args.freqs]
aevalsrc_expr = "+".join(aevalsrc_waves)
ffplay_filter = f"aevalsrc=({aevalsrc_expr})/{len(args.freqs)}*{args.volume}:d={args.time}"
print("aevalsrc filter:")
print(ffplay_filter)
subprocess.run([
"ffplay", "-f", "lavfi", "-i", ffplay_filter, "-autoexit", "-nodisp"
], stderr=subprocess.DEVNULL)
Просто вставьте в ~/bin/beep
и chmod +x beep
, чтобы сделать его доступным. Он не совсем поддерживает те же опции, но если сделать это, то код станет намного длиннее, чем он есть.