ラベル C06.カセットテープデジタル化 の投稿を表示しています。 すべての投稿を表示
ラベル C06.カセットテープデジタル化 の投稿を表示しています。 すべての投稿を表示

2021年12月1日水曜日

カセットテープデジタル化

 カセットテープデジタル化の続き。

アルバム1枚(カセットテープではA面、B面)をデジタル化するとき、これまで曲毎にmp3とflacファイルを作っていたが、今後は

 曲毎:mp3 ビットレート192k サンプリングレート48k
 アルバム全体:opus ビットレート256k サンプリングレート48k

のセットで残すことにする。

アルバムのopusファイルを作るときは、全曲名をmetadataのlyricsに入れておく。


しかし、30年前に録音したカセットテープの音楽が全く劣化していないことに感動。TDKのSAやSONYのCDixテープが良いのか、再生しているONKYOのカセットデッキK-505FXが良いのか。デジタル化するときに品質を落とさないようにしないといけない。。。


■■各種コマンド

■ハードのセッティング
(カセットデッキ)→(DigiFi付録のDDC)→(USB)

■カセットテープの入力を聴く
arecord -c 2 -f S16_LE -r 48000 -D hw:1,0 | aplay

■カセットテープのA面だけをDDCで取り込み。 −d は録音時間の指定(秒)
arecord -c 2 -f S24_3LE -r 48000 -D hw:1,0 -d 1920 /home/nemo/ミュージック/aaa.wav

■wavファイルの結合
□以下のようにコーデックにpcm_s24leを指定しないと、インプットファイルのビットレートが24bitでもアウトプットファイルのビットレートが16bitになってしまう。
ffmpeg -i in1.wav -i in2.wav -filter_complex "concat=n=2:v=0:a=1" -c:a pcm_s24le out.wav

□A面とB面のwavを結合してアルバム全部をopusにまとめる←これまでのflacの代わり
ffmpeg -i A面.wav -i B面.wav -filter_complex "concat=n=2:v=0:a=1" -acodec libopus -metadata artist="aaa" -metadata album="bbb" -metadata genre="JPop" -metadata date="1988" -ab 256k -ar 48000 両面.opus

■ノーマライズのためのvolume確認・・・ノーマライズはAudacityで行う
ffmpeg -i data.wav -af "volumedetect" -f null -

■アルバムのトラックをまとめて変換するスクリプト
bash ./ffmpeg_wav_singles.sh

■1秒の無音wavファイルを作成
ffmpeg -ar 48000 -t 00:00:01 -f s24le -acodec pcm_s24le -ac 2 -i /dev/zero muon.wav

■複数ファイルに無音を挟みながら結合
ffmpeg -i 01*.wav -i muon.wav -i 02*.wav -i muon.wav -i 03*.wav -i muon.wav -i 04*.wav -i muon.wav -i 05*.wav -i muon.wav -i 06*.wav -i muon.wav -i 07*.wav -i muon.wav -i 08*.wav -i muon.wav -i 09*.wav -filter_complex "concat=n=17:v=0:a=1" -c:a pcm_s24le out.wav

□上記のインプットファイル部分の大部分を下記のスクリプトで作れる
op=""; for j in {01..08}; do op=$op" -i "$j".wav -i muon.wav"; done


■拡張子がmp3のファイルの拡張子以外部分を取り出す→これをffmpegに渡して一括変換に使う
for j in *.mp3 ; do echo ${j%.mp3}; done


■■ffmpeg_wav_singles.shファイルの中身

#!/bin/bash

#ifile01,m_ti01等の変数名を編集し、その値を取り出すところに苦労。 `eval echo '$'"ifile"$track` の部分。配列にしておけばよかった。行頭や変数の区切りに全角スペースはNG

music_path=""

m_ar="artist name"; m_al="album name"; m_da="1990"; m_ge="JPop"

tracks="10"


ss01="00:00:00"; to01="00:04:04"; m_ti01="track 01 name";

ss02="00:04:07.8"; to02="00:09:01"; m_ti02="track 01 name";

ss03="00:09:03.8"; to03="00:13:03"; m_ti03="track 01 name";

ss04="00:13:06"; to04="00:18:26"; m_ti04="track 01 name";

ss05="00:18:29.5"; to05="00:22:28"; m_ti05="track 01 name";

ss06="00:22:31"; to06="00:26:22"; m_ti06="track 01 name";

ss07="00:26:24.7"; to07="00:30:15"; m_ti07="track 01 name";

ss08="00:30:26.8"; to08="00:34:43"; m_ti08="track 01 name";

ss09="00:34:47"; to09="00:38:28"; m_ti09="track 01 name";

ss10="00:38:30"; to10="00:43:05"; m_ti10="track 01 name";


i=1

string_lyrics=""


while [ $i -le $tracks ]

do

  track=`printf "%02d" $i`

  #インプットファイル名、タイトル名取り出し

#  string_ifile=`eval echo '$'"ifile"$track`

  string_ifile="in.wav"

  string_ss=`eval echo '$'"ss"$track`

  string_to=`eval echo '$'"to"$track`

  string_title=`eval echo '$'"m_ti"$track`

  #string_lyricsはopusファイルに全曲名を入れるためのメタデータ

  string_lyrics=$string_lyrics$track" "`eval echo '$'"m_ti"$track`" "


  #曲毎mp3変換

  ffmpeg -ss "$string_ss" -to "$string_to" -i "$string_ifile" -acodec libmp3lame -ab 192k -ar 48000 -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "track"="$i" -metadata "title"="$string_title" "$track"_"$string_title.mp3"


  i=`expr $i + 1`

done


#アルバム全体opus変換

ffmpeg -i "$string_ifile" -acodec libopus -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "lyrics"="$string_lyrics" -ab 256k -ar 48000 "$m_ar"_"$m_al.opus" 

 

ffmpeg_wav_singles.shここまで



2016年6月5日日曜日

音楽データバックアップ

カセットテープのデジタル化を再開したが、過去のCDもメディアが嵩張るのでblu-rayに移動するべく、前の投稿にも書いたようにmp3と念の為flacに変換してバックアップしている。

ひとまず今日済んだところまでをBD−Rに焼く。
growisofsコマンドはソースがisoじゃないとだめのようなので、オーサリング出来るフロントエンドが必要。ということで K3b を導入した。
sudo apt-get install k3b
使い方はなんとなく分かったが、気をつけたのは今回のBD-R用にファイルシステムをUDFを選んだ所。

12.5GBを焼くのに約33分かかった。
その後の読み取りもUbuntuでは問題ない。

WAVE→mp3、flac変換スクリプト


WAVEファイルとして保管していた音楽データをmp3とflacに変換するスクリプトを作った。
メタデータを予め冒頭部で準備しておき、while文で一気にmp3とflacを作成する。
キモは下記青字部の、「ifile01」〜「ifilexx」の変数名を作って、さらにその値を参照するところ。
 `eval echo '$'"ifile"$track`$ifile01
などとなり string_ifile変数に代入される。 evalする時に$が先に解釈されないようシングルコーテーションでくくっておくことが必要。
Windowsだったら変数を配列にするしかないと思うが、シェルスクリプトではこんなことも出来る。最初から配列にしておけば苦労しなかったが、シェルスクリプトの勉強になった。

スクリプトのファイル名「ffmpeg_wav.sh」
#!/bin/bash
music_path="/media/mobile/FAT32/Sound/○○"
m_ar="アーチスト名"; m_al="アルバム名"; m_da="2000"; m_ge="JPop"
tracks="14"
ifile01="01 曲1.wav";     m_ti01="曲1";
ifile02="02 曲2.wav";         m_ti02="曲2";

 (中略)
ifile14="14 曲14.wav";     m_ti14="曲14";

i=1
while [ $i -le $tracks ]
do
  track=`printf "%02d" $i`
  #インプットファイル名、タイトル名取り出し
  string_ifile=`eval echo '$'"ifile"$track`
  string_title=`eval echo '$'"m_ti"$track`
  #mp3変換
  ffmpeg -i "$music_path/$string_ifile" -acodec libmp3lame -ab 192k -ar 44100 -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "track"="$i" -metadata "title"="$string_title" "$music_path/$track"_"#$string_title.mp3"
  #flac変換
  ffmpeg -i "$music_path/$string_ifile" -acodec flac -metadata "artist"="$m_ar" -metadata "album"="$m_al" -metadata "genre"="$m_ge" -metadata "date"="$m_da" -metadata "track"="$i" -metadata "title"="$string_title" "$music_path/$track"_"$string_title.flac"
  i=`expr $i + 1`
done

音楽CDからのリッピングにはAsunderを使用。使い勝手はまずまずだが、CDDBからのデータ取得が1回しかできなかった。

2016年5月29日日曜日

カセットテープデジタル化


Digi Fi No.15付属のDDCを使ってカセットテープをデジタル化する。
といっても、中断していたのを再開するだけ。

■録音
中断前にデジタル化していたファイルは

mobile@mobile-ThinkPad-X201s:~$ ffmpeg -i /media/mobile/FAT32/Sound/Tape/xxx.wav・・・
Input #0, wav, from '/media/mobile/FAT32/Sound/Tape/xxx.wav':
  Metadata:
    title           : SL
    album           : SL
    artist          : ''Y
    genre           : JPop
  Duration: 00:05:28.89, bitrate: 2304 kb/s
    Stream #0:0: Audio: pcm_s24le ([1][0][0][0] / 0x0001), 48000 Hz, 2 channels, s32 (24 bit), 2304 kb/s
とサンプリング周波数が48kHz、量子化ビットが24bit でキャプチャーできているが、今日はうまくいかない。最初からおさらいする。
mobile@mobile-ThinkPad-X201s:~$ cat /proc/asound/Olasonic/stream0
TOWA Electronics Olasonic at usb-0000:00:1a.0-1.2, full speed : USB Audio

Playback:
  Status: Stop
  Interface 3
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 96000, 88200, 48000, 44100
  Interface 3
    Altset 2
    Format: S24_3LE
    Channels: 2
    Endpoint: 3 OUT (ADAPTIVE)
    Rates: 96000, 88200, 48000, 44100

Capture:
  Status: Running
    Interface = 2
    Altset = 1
    Packet Size = 243
    Momentary freq = 48000 Hz (0x30.0000)
  Interface 2
    Altset 1
    Format: S16_LE
    Channels: 2
    Endpoint: 2 IN (ADAPTIVE)
    Rates: 96000, 48000
  Interface 2
    Altset 2
    Format: S24_3LE
    Channels: 2
    Endpoint: 2 IN (ADAPTIVE)
    Rates: 96000, 48000
録音は arecord コマンドでやってみる(が今のところ、フォーマットの指定 -f S24_3LE あたりでうまくいかない)

まずは、録音デバイスの認識
mobile@mobile-ThinkPad-X201s:~$ arecord -l
**** ハードウェアデバイス CAPTURE のリスト ****
カード 0: MID [HDA Intel MID], デバイス 0: CX20585 Analog [CX20585 Analog]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
カード 1: Olasonic [Olasonic], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 0/1
  サブデバイス #0: subdevice #0
となっているので、このDDCを -D オプションで
arecord -c 2 -f S24_3LE -r 48000 -D hw:1,0 StardustRevue.wav
のように指定する。
Ubuntuのサウンドの設定で、「入力」ー「サウンドの入力元」にてこのDDCをデフォルトに選択していれば -D オプション は不要。


■サンプリングデータの正規化
サンプリングしたばかりのデータは正規化が必要なものもある。
こちらのサイトを参考にさせていただいた。
http://nico-lab.net/normalize_audio_with_ffmpeg/

 以下、シェルスクリプトにしているが ffmpeg の volumedetect というフィルター?で
ffmpeg -i $1 -af volumedetect -f null /dev/null
 を実行すると、あるデータでは
・・・
[Parsed_volumedetect_0 @ 0x148bea0] n_samples: 31573194
[Parsed_volumedetect_0 @ 0x148bea0] mean_volume: -18.4 dB
[Parsed_volumedetect_0 @ 0x148bea0] max_volume: -1.0 dB
[Parsed_volumedetect_0 @ 0x148bea0] histogram_1db: 835
[Parsed_volumedetect_0 @ 0x148bea0] histogram_2db: 4076
[Parsed_volumedetect_0 @ 0x148bea0] histogram_3db: 12005
[Parsed_volumedetect_0 @ 0x148bea0] histogram_4db: 27239
max_volume の -1.0db 分が正規化の余地あり。(と思う)
そこで、ffmpegの -af "volume=1.0dB" オプションを使う。

ffmpeg -i xxx.wav -af "volume=1.0dB" xxx-2.wav
で、volumedetectすると max_volume とともに mean_volume も 1.0dB 大きくなった。
[Parsed_volumedetect_0 @ 0x148dbc0] n_samples: 31573194
[Parsed_volumedetect_0 @ 0x148dbc0] mean_volume: -17.4 dB
[Parsed_volumedetect_0 @ 0x148dbc0] max_volume: -0.0 dB
[Parsed_volumedetect_0 @ 0x148dbc0] histogram_0db: 835
[Parsed_volumedetect_0 @ 0x148dbc0] histogram_1db: 4076
[Parsed_volumedetect_0 @ 0x148dbc0] histogram_2db: 12008
[Parsed_volumedetect_0 @ 0x148dbc0] histogram_3db: 27231
ただし、なぜか24bitが16bitになったようで、ファイルサイズも約2/3になっていた。
これでは折角24bitでサンプリングしたのが無駄になってしまう。
ffmpegでうまく処理できないか試したが
ffmpeg -i xxx.wav -af "format=S24LE|volume=1.0dB" xxx-2.wav
のように24bitの指定をしつつボリュームをあげようとするとエラーになる。
結局、正規化にはAudacityを使った。
  • メニューの「エフェクト」-「正規化」から最大振幅を0dbに
  • メニューの「ファイル」-「オーディオの書き出し」から、「その他の非圧縮ファイル」をとし、「オプション」から「ヘッダ」を「WAV(Microsoft)」、「エンコーディング」を「Signed 24bit PCM」
 としてやると、24bitのまま正規化できた。
今後、ffmpegでできないか調査する。