Ubuntuで時報を流そう

Ubuntu
Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

前提

一人でパソコンで作業していると時間を知らせるものがないので食事を取るのを忘れたり、寝る時間を忘れてしまう。なので定期的に音を流し、一定時間が過ぎたことを知らせてもらう。

使うもの

よさげな音をダウンロードする。mp3が望ましい

時報の音

時報音の音源
時報音の音源ファイル(MP3/OGG)を無料でダウンロードできます。NHKの時報、TBSラジオの時報、JR接近メロディ風。

学校のチャイム (四番を選びました。)

フリー効果音:学校のチャイム|OtoLogic
フリー効果音:学校のチャイム|「キンコンカンコン」でお馴染み、学校のチャイム音です

ジュピターB

ジュピターB (発車ベル) - Sheet music for Piano
Made by 令和少年. Music notation created and shared online with Flat

まずコマンドラインで流して見ましょう

cvlc --play-and-exit ./jupiter.mp3

ジュピターBはオシャレですが、学校のチャイムはカッコよさがないですね

自分は作業をしているとき音楽を聞いたりしているので音を大きくすることにします

数字は%で指定です。
調子に乗って1000%とか入れるのは辞めましょう。(超音割れジュピターヤバい)
音源によりますが、150~300くらいが適正だと思います。

cvlc --play-and-exit ./jupiter.mp3 -g 200

cvlcの場合はx倍で指定します。少数も可

cvlc --play-and-exit jupitor.mp3 --gain=2.5

cronで自動化

自動で音を流すためにcronを使います。

crontab -e

こんなのがでるので、

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

* * * * * export XDG_RUNTIME_DIR="/run/user/1000"; mpg321 /home/nanasi/Music/jupiter.mp3 -g 200

こんな感じで追加しましょう。こうすると一分毎に音が流れると思います。

0 1-11,13-23 * * * export XDG_RUNTIME_DIR="/run/user/1000"; mpg321 /home/nanasi/Music/Japanese_School_Bell04-mp3/Japanese_School_Bell04-1\(Long\).mp3 -g 300
30 * * * * export XDG_RUNTIME_DIR="/run/user/1000"; mpg321 /home/nanasi/Music/jupitor.mp3 
0 0,12 * * * export XDG_RUNTIME_DIR="/run/user/1000";cvlc --play-and-exit /home/nanasi/Music/jihou-sine-3f.mp3 --gain=2.3

この設定だと0時と12時ぴったりに時報が流れ、それ以外の時間はチャイムが流れます。
そして毎時30分にジュピターが流れます。

イヤホンが刺さっていないとき、流さないよう修正

これを使ってすぐ気づいたのですが、イヤホンが刺さっていないときも爆音でチャイムがなってしまいます。

止め方も特にないので、例えば図書館で使っていて爆音が流れてしまったら司書さんにボコボコにされてしまいます。なのでイヤホンが刺さっていないときは流さないようにします。

このコマンドをイヤホンを外した時

amixer contents

オンオフが切り替わるものがあるので(diffなどで比較しても良)それを17番と置き換えてください

amixer -c0 cget numid=17

このコマンドでオンかオフか分かるので

#!/bin/bash

current_hour=$(date +"%H")
current_minute=$(date +"%M")

jack_status=$(amixer -c0 cget numid=17 | grep -o 'values=on\|values=off')

if [[ $jack_status == 'values=on' ]]; then
    if [[ $current_hour == 00 ]] || [[ $current_hour == 12 ]] && [[ $current_minute -eq 00 ]]; then
        cvlc --play-and-exit /home/nanasi/Music/jihou-sine-3f.mp3 --gain=2.5
    elif [[ $current_minute -eq 30 ]]; then
        cvlc --play-and-exit /home/nanasi/Music/jupitor.mp3 --gain=2.5
    else
        cvlc --play-and-exit /home/nanasi/Music/Japanese_School_Bell04-mp3/Japanese_School_Bell04-1\(Long\).mp3 --gain=2.5
    fi
else
    echo "ヘットフォンが刺さっていないので時報を再生しませんでした"
fi

こんな感じのシェルスクリプトを作ってcronをこんな感じにすれば完成

0,30 * * * * export XDG_RUNTIME_DIR="/run/user/1000"; bash /home/nanasi/zihou.sh

更にBluetoothイヤホンが接続されている時は再生

このコマンドで確認できます。

pactl list short sinks
47      alsa_output.pci-0000_01_00.1.pro-output-3       PipeWire        s32le 8ch 48000Hz       SUSPENDED
48      alsa_output.pci-0000_01_00.1.pro-output-7       PipeWire        s32le 8ch 48000Hz       SUSPENDED
49      alsa_output.pci-0000_01_00.1.pro-output-8       PipeWire        s32le 8ch 48000Hz       SUSPENDED
50      alsa_output.pci-0000_01_00.1.pro-output-9       PipeWire        s32le 8ch 48000Hz       SUSPENDED
55      alsa_output.pci-0000_00_1f.3.analog-stereo      PipeWire        s32le 2ch 48000Hz       SUSPENDED
4166    bluez_output.03_64_B9_08_FD_31.1        PipeWire        s16le 2ch 48000Hz       RUNNING

Bluetoothを使っているときはRUNNINGになっています。なのでコードをシェルをこう変更します。

#!/bin/bash

current_hour=$(date +"%H")
current_minute=$(date +"%M")
#current_hour=00
#$current_minute=00

jack_status=$(amixer -c0 cget numid=17 | grep -o 'values=on\|values=off')

if pactl list short sinks | grep 'bluez' | grep -q 'RUNNING' || [[ $jack_status == 'values=on' ]]; then
    if [[ $current_hour == 00 ]] || [[ $current_hour == 12 ]] && [[ $current_minute -eq 00 ]]; then
        cvlc --play-and-exit /home/nanasi/Music/jihou-sine-3f.mp3 --gain=2.5
    elif [[ $current_minute -eq 30 ]]; then
        cvlc --play-and-exit /home/nanasi/Music/jupitor.mp3 --gain=2
    else
        cvlc --play-and-exit /home/nanasi/Music/Japanese_School_Bell04-mp3/Japanese_School_Bell04-1\(Long\).mp3 --gain=2.5
    fi
else
    echo "ヘットフォンが刺さっていないので時報を再生しませんでした"
fi

今後

  • Bluetoothが刺さっているかも確認したい。11/14追記
  • もっと音で時刻が分かるようにしたい。
  • チャイムはいまいち、もっとかっこいい音がほしい

参考

How to Detect Headphone Connection/Disconnection in Linux

Cronで音が出ない #cron – Qiita

https://askubuntu.com/questions/548915/how-to-run-cvlc-closing-after-the-play.

https://linux.die.net/man/1/mpg321.