2022년 7월 12일 화요일

ZK-502H 블루투스 앰프(TPA3116D2) 구입

책상 위의 음악 감상 시스템을 단순화할 필요가 있어서 기존의 덩치 큰 앰프를 대체할 목적의 작은 블루투스 앰프를 구입하였다. 알리익스프레스를 이용했다면 더 싸게 구입했겠지만, 배송을 기다리기 곤란한 사정이 있는지라 신속한 네이버 쇼핑이 가능한 국내의 업체를 이용하였다. 전원장치로는 19V 1.58A의 스위칭 어댑터가 포함되어 있었다. 19V 어댑터 사용 시 4옴 스피커에서 30W x 2, 8옴 스피커라면 32W x 2의 최대 출력이 나온다고 한다. 하부 패널은 검정색 아크릴판이지만 상부 패널은 아무리 보아도 알루미늄으로 보인다. 이 가격에 이런 품질이 나오다니 놀랍기만 하다.


자질구레하게 챙겨주는 것도 많다. 친절하게도 조립용 공구와 전원 어댑터용 플러그까지!

더 이상 무엇을 바라겠는가? USB 매체용 단자는 사실상 별로 쓸모가 없다. 음원 파일을 복사하여 앰프에 꽂을 일이 없으니... 재생할 곡을 선택할 수도 없지 않은가?

유선 입력은 3.5mm 스테레오 폰잭을 통해서 이루어진다. 블루투스 연결을 하려면 유선 입력 단자에 플러그를 꽂지 말아야 한다. 헤드폰 출력용 단자도 있지만 단순히 입력을 라우팅하는 것 같다. 

주변에 잡음이 많아서 음질을 면밀히 검토하지는 못했으나 일반적인 음악감상 용도라면 큰 문제가 없어 보인다. 블루투스 연결을 잘 쓰지는 않지만 아마 얼마 지나지 않아서 유용성을 발견하게 될 것이다. 휴대폰에서 블루투스 연결을 시도하였더니 'Wuzhi Audio'라는 기기명이 보였다. 상부 패널의 모델명(ZK-502H) 위에 새겨진 장식적인 글꼴로 새겨진 글씨가 바로 Wuzhi Audio였다.

지금까지 class D 오디오 증폭기를 사용한 저가 앰프를 몇 개 써 보았다. 실제 음악을 들으면서 대단히 만족하지는 못했었다. 그 이유는 부실한 전원이나 주변 부품이 아니었나 한다. 이번에 구입한 앰프는 그런대로 괜찮다. 그리고 특별한 일이 없다면 앞으로 class D 앰프를 더 살 일은 없을 것이다.

MAX4410 헤드폰 앰프 보드를 살 때 잘못 선택하여 아직 활용을 하지 못하고 있는 모노 앰프 보드(XH-M542). TPA3116D2를 사용한 제품으로서 구동 전원은 DC 12-26V, 출력은 최대 100W라고 한다.  당연히 4옴 스피커에 대한 수치일 것이다.


phyloFlash를 수동으로 설치해 보니...

편리함으로 인하여 얻는 것이 있다면, 당연히 잃는 것도 있다. 편리함이라는 껍데기 속에 숨어있는 기초적인 원리를 알 수 없게 된다. phyloFlash는 whole-metagenome shotgun sequencing data로부터 full-length 16S rRNA 염기서열을 재구성해주는 Perl script 모음이다. Conda를 이용하여 쉽게 설치할 때에는 전혀 모르고 있던 16S rRNA reference DB의 설치 과정('phyloFlash_makedb.pl --remote')이 생각보다 간단하지 않았다. vsearch, bowtie, BBMap(bbmask.sh & bbmap.sh) 등 추가적으로 필요한 프로그램이 몇 개 더 있었다. 이를 다 확인한 다음에는 NCBI에서 UniVec 데이터베이스를 다운로드하고, 마지막으로 가장 중요한 단계인 SILVA rRNA DB를 가져다가 재가공을 거쳐 설치한다. DB의 설치 위치는 phyloFlash.pl 메인 스크립트 실행 때 -dbhome 파라미터 혹은 PHYLOFLASH_DBHOME 변수로 지정한다.

SILVA DB의 다운로드 및 재가공 과정은 다음과 같다.

  1. SIVA DB ftp site에서 /current/Exports/*_SSURef_N?99_tax_silva_trunc.fasta.gz 파일을 다운로드하여 압축 해제(오늘 기준으로 SILVA_138.1_SSURef_NR99). 라이선스 정보(Creative Commons Attribution 4.0, CC-BY 4.0)를 읽어 볼것.
  2. barrnap_HGV를 이용하여 SSU에 섞인 LSU contamination을 검색하여 제거. 120개의 염기서열이 사라졌다.
  3. bbmask를 사용하여 low entropy region을 마스킹.
  4. bbmap을 사용하여 UniVec contamination을 제거.
  5. 'vsearch --makeudb_usearch'를 사용하여 UDB 파일 생성. Robert Edgar(drive5.com)의 설명에 의하면 UDB database file이란 서열과 그것의 k-mer index를 수록한 파일이라 한다(링크). 바이너리 파일이므로 .udb 파일을 텍스트 편집기로 열어 보는 것은 의미가 없다.
  6. 'vsearch --cluster_fasta --id 0.96' 조건으로 사용하여 클러스터링.
  7. bowtie로 인덱싱(bowtie2도 아니고...)

상당히 신경을 써서 후처리를 거치고 있다. Sequence identity threshold를 96%로 맞추어서 클러스터링을 한다는 점이 중요하다. 단계 6번이 실제로 어떻게 돌아가는지를 알기 위하여 화면에 표시되는 메시지를 확인해 보았다.

[09:50:44] running subcommand:
	   /usr/bin/vsearch   --cluster_fast
	   ./138.1/SILVA_SSU.noLSU.masked.trimmed.NR99.fasta --id 0.96
	   --centroids ./138.1/SILVA_SSU.noLSU.masked.trimmed.NR96.fasta
	   --notrunclabels --threads 32 
vsearch v2.14.1_linux_x86_64, 125.7GB RAM, 32 cores
https://github.com/torognes/vsearch

Reading file ./138.1/SILVA_SSU.noLSU.masked.trimmed.NR99.fasta 100%  
609727540 nt in 421417 seqs, min 803, max 3706, avg 1447
Masking 100% 
Sorting by length 100%
Counting k-mers 100% 
Clustering 100%  
Sorting clusters 100%
Writing clusters 100% 
Clusters: 156798 Size min 1, max 1184, avg 2.7
Singletons: 107548, 25.5% of seqs, 68.6% of clusters

클러스터링을 거쳐 최종적으로 만들어지는 파일은 다음과 같다. SILVA_SSU 뒤에 새로 붙은 문자열로부터 어떤 가공을 거쳤는지를 알 수 있다.

./138.1/SILVA_SSU.noLSU.masked.trimmed.NR96.fixed.fasta

Metagenome assembly를 일상적으로 실시하게 된 요즘, 동일한 데이터로부터 16S rRNA 염기서열을 찾아내는 일이 과연 무슨 의미가 있겠느냐고 할 수도 있겠으나, 꼭 그렇지만도 않다는 것이 나의 생각이다.



2022년 7월 8일 금요일

개미지옥과 같은 파일 복사 작업, 그리고 8시간 20분이 걸린 KRAKEN 2 standard DB 구축

파일의 수가 많으면 복사하는데 많은 시간이 걸린다. 계산작업용 서버에 보관 중이던 파일을 DAS로 rsync를 하는 중인데, dRep과 같이 pairwase comparison에 의해 만들어진 수많은 파일을 복사하면서 '차라리 tar로 묶어서 보낼 것을..'하는 후회를 하고 있다. 뿐만 아니라 어제부터 시작한 KRAKEN 2 standard database 설치 작업도 꼬박 하루를 넘기고 있다.

KRAKEN 2 standard database를 만드는 스크립트('kraken2-build --standard --db $DBNAME')를 실행하다가 'rsync_from_ncbi.pl: unexpected FTP path (new server?)'라는 에러가 발생하였다. 이는 KRAKEN 2 wiki의 FAQ 문서(링크)에도 나올 정도로 잘 알려져 있는데, 아직 완벽한 해결책이 나오지 않은 것 같다. 검색을 거듭하여 다음의 두 웹문서에 나온 방법을 참고하여 스크립트를 수정하니 겨우 에러 없이 파일 다운로드가 진행되었다.

KRAKEN 2 DB를 만드는 중에 화면에 표시되는 사항을 기록해 보았다. 신통치 못한 리눅스 머신에서 소요된 공식 시간은 8시간 20분이라고 나오지만(Intel Xeon CPU E5-2630 v3 @2.40GHz, 24 thread, 메모리 256GB), 중간에 'y'를 타이핑하기를 기다리는 상태로 밤새도록 진행이 되지 않았기에 실제로는 만 하루가 조금 더 걸렸다. 정말 소중하게 만든 DB라서 꼭꼭 숨겨놓을 것이 아니라 남에게 나누어 주고 싶다.

$ kraken2-build --standard --threads 24 --db MY_KRAKEN2_DB_20220707
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 459 projects (804 sequences, 1.26 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 32062 projects (75757 sequences, 133.68 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 11665 projects (14554 sequences, 464.18 Mbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Masking low-complexity regions of downloaded library... done.
Downloading plasmid files from FTP... done.
Masking low-complexity regions of downloaded library... done.
mv: try to overwrite `assembly_summary.txt', overriding mode 0444 (r--r--r--)? y
Step 1/2: Performing rsync file transfer of requested files
Rsync file transfer complete.
Step 2/2: Assigning taxonomic IDs to sequences
Processed 1 project (705 sequences, 3.30 Gbp)... done.
All files processed, cleaning up extra sequence files... done, library complete.
Downloading UniVec_Core data from server... done.
Adding taxonomy ID of 28384 to all sequences... done.
Masking low-complexity regions of downloaded library... done.
Creating sequence ID to taxonomy ID map (step 1)...
Found 43829/43864 targets, searched through 839137274 accession IDs, search complete.
lookup_accession_numbers: 35/43864 accession numbers remain unmapped, see unmapped.txt in DB directory
Sequence ID to taxonomy ID map complete. [3m7.052s]
Estimating required capacity (step 2)...
Estimated hash table requirement: 62886222992 bytes
Capacity estimation complete. [20m56.119s]
Building database files (step 3)...
Taxonomy parsed and converted.
CHT created with 16 bits reserved for taxid.
Completed processing of 138785 sequences, 142856031428 bp
Writing data to disk...  complete.
Database files completed. [7h56m29.344s]
Database construction complete. [Total: 8h20m32.627s]
$ du -sh MY_KRAKEN2_DB_20220707/
228G	MY_KRAKEN2_DB_20220707/

NCBI BLAST DB 설치 역시 대단한 인내심을 요구한다. nt-nucl-metadata.jason 파일을 가져다가 다운로드할 파일의 FTP full path를 추출하여 전부 wget(parallel)으로 받은 뒤, md5 checksum을 확인해 보았다. 그런데 nt database를 구성하는 69개(2022년 7월 4일 기준) 파일 중 해시 값이 일치하는 것이 거의 없지 않은가? 접속이 원활하지 않아 끊어진 경우, 바로 다음 파일의 전송을 시도해서 그러는 것인지? '-c(--continue)'에 재시도 회수를 지정하면 더 나을지는 모를 일이다. 

파일을 가져오는 더 안전한 방법은 rsync를 쓰는 것이다. 찾아보니 rsync와 parallel을 함께 사용하여 BLAST DB를 다운로드하는 방법(링크)이 있었다. 방법을 소개하자면 다음과 같다. 

$ rsync --list-only rsync://ftp.ncbi.nlm.nih.gov/blast/db/nt*.gz | grep '.tar.gz' | head -n 1
-rw-r--r--  4,310,538,146 2022/07/05 02:51:08 nt.00.tar.gz
$ rsync --list-only rsync://ftp.ncbi.nlm.nih.gov/blast/db/nt*.gz | grep '.tar.gz' | awk '{print "ftp.ncbi.nlm.nih.gov/blast/db/" $NF}' > nt.links.list
$ head -n 1 nt.links.list 
ftp.ncbi.nlm.nih.gov/blast/db/nt.00.tar.gz
$ cat nt.links.list | parallel -j4 'rsync -h --progress rsync://{} .'

awk 명령어에서 '{print $NF}'는 입력물의 마지막 컬럼을 출력하게 해 준다. $1, $2,... $n이 각 컬럼을 가리키는 변수이므로, 컬럼의 수를 나타내는 awk 변수인 NF에 '$'를 씌워서 $NF라고 적으면 마지막 컬럼에 해당한다. 만약 '{print $(NF-1)}'라고 명령하면 마지막 직전의 컬럼을 인쇄한다.  

이를 이용하여 69개 파일을 전부 손쉽게 다운로드하였고, md5 해시도 정상임을 확인하였다. 명령어를 실행하고 있는데 다음과 같은 메시지가 튀어나와서 약간 놀랐다.

흠, 좀 무서운데?

wget이나 curl로 파일을 가져올 때에는 나타나지 않던 경고문이다. 이들 명령어보다 rsync가 네트워크 자원을 더 많이 잡아먹는가? 미안하지만 다음에도 rsync를 쓰게 될 것 같다. NCBI가 공식적으로 제공하는 다운로드 스크립트인 update_blastdb.pl은 접속이 원활하지 않은 상태에서 얼마나 안정적으로 돌아가는지 잘 모르겠다.




2022년 7월 6일 수요일

맘바(mamba)는 무엇인가? - Metagenome binning 관련 도구를 설치하다가 만난 새로운 세계

위키백과에 의하면 맘바(mamba)는 코브라과 맘바속에 속하는 매우 사납고 재빠른 독사라고 한다. 원래의 뜻은 뱀의 한 종류를 일컫는 것이겠지만, 오늘의 주제는 패키지 매니저인 conda를 대체하기 위해 나온 프로그램인 mamba에 관한 것이다. 경쟁자인 (아나)콘다보다 한 수 위임을 보이기 위해 이런 이름을 지은 것 같다. 

Mamba is a reimplementation of the conda package manager in C++.

귀여운 독사? mamba-org는 package manager(mamba), package server(quetz), 그리고 package builder(boa)로 구성된 새로운 생태계이다. 리눅스 디스트로처럼 자꾸 파편화되는 것은 싫은데... 왜냐하면 계속 공부하면서 따라잡기만 하다가 시간이 다 지나는 것 같기 때문이다.

 

Metagenomic analysis를 도와주는 종합 도구인 MetaWRAP을 설치하기 위하여 mamba를 쓰게 되었다. 설치 설명 문서에 의하면 conda보다 훨씬 빠르다고 한다. 실제로 체감 속도도 빠르다. 이번이 처음 설치는 아니다. 아마 이전 시도에서는 필요한 데이터베이스를 미처 다 설치하지 못해서 실제 활용은 하지 못했었다. MetaWRAP을 metagenome-assembled genome(MAG)의 binning 도구(metaBAT2, CONCOCT 및 MaxBin2)를 종합하여 최적의 결과를 만드는 솔루션으로만 기억하고 있었는데, 실제로는 일루미나 read의 처리와 조립을 담당하는 모듈도 들어 있었다. 괜히 BBduk과 FastQ-Screen을 사용하는 전처리 스크립트를 만드느라 시간을 낭비하고 있었다!

설치 막바지에는 QUAST가 요구하는 GRIDSS, SILVA 및  BUSCO(tools & databases)를 따로 설치하라는 메시지가 나온다.

The default QUAST package does not include:
* GRIDSS (needed for structural variants detection)
* SILVA 16S rRNA database (needed for reference genome detection in metagenomic datasets)
* BUSCO tools and databases (needed for searching BUSCO genes) -- works in Linux only!

To be able to use those, please run
    quast-download-gridss
    quast-download-silva
    quast-download-busco

BUSCO DB를 다운로드하는 과정에서 에러가 발생하였다. 'http error', 301, 'Moved Permanently'라니... BUSCO 웹사이트를 방문하니 v3로 바뀌었다는 안내가 보인다. 에러 메시지를 보면 다음의 세 파일을 수동으로 다운로드하여 path_to_miniconda3/envs/metawrap-env/lib/python2.7/site-packages/quast_libs/busco/ 아래에 복사하란다.

  • https://busco.ezlab.org/v2/datasets/bacteria_odb9.tar.gz
  • https://busco.ezlab.org/v2/datasets/eukaryota_odb9.tar.gz
  • https://busco.ezlab.org/v2/datasets/fungi_odb9.tar.gz 

BUSCO v2 웹사이트Download all datasets 링크를 눌렀을 때 나오는 문서에는 https://가 아니라 http://로 시작하는 구식 URL이 나열되어 있었다.

KRAKEN 2 및 NCBI BLAST nt database를 설치하여  MetaWRAP을 쓸 수 있는 상태로 만들려면 시간이 더 걸릴 것이다. 비록 MetaWRAP이 좋은 도구임에는 틀림이 없으나, 2018년에 처음 논문으로 선을 보였으니(링크) 이에 대한 자체 업데이트 말고도 다른 연구팀에 의한 진보된 도구가 더 나왔을 것이다. 예를 들어 Nextflow 환경에서 돌아가는 nf-core/mag라든지... nf-core/mag는 일루미나뿐만이 아니라 long read를 수용할 수 있다는 것은 매우 바람직하지만, 개발자 Ran Wick도 이제 손을 놓은 porechop을 포함하고 있으니 이를 어쩌란 것인지?

Nextflow는 NanoCLUST와 Bactopia를 통해 조금 경험해 보았다. Dependency를 일일이 설치할 필요가 없어서 편리하기는 하나, metagenome 관련 도구라면 프로그램이 아닌 대용량의 DB를요구할 터인데 이를 어떻게 처리하는지 궁금하다.

아무 생각 없이 MAG의 binning이라는 표현을 썼는데, 이는 정확하지 않다. 엄밀히 말하자면 MAG는 완성도를 점검하여 어느 수준에 오른 bin이라고 한다. 즉 MAG는 binning 결과를 잘 갈고 다듬어서 얻어진 것이지, binning의 대상은 아닌 셈이다. Biostars에 실린 Difference between a bin and a MAG를 조금 인용해 본다.

Basically, MAGs are bins that have been checked for completeness and refined of necessary. Any of your bins that are >90% complete and <10% contaminated can be considered MAGs as they are.


FastQ-Screen으로 whole-metagenomic shotgun read에서 host genome sequence 없애기

Whole-metagenome shotgun(WGS) 시퀀싱 자료의 성공적인 분석을 위하여 host의 유전체 서열을 제거하는 일은 매우 중요하다. 그런데 어떤 방법으로? 즐겨 사용하는 CLC Genomics Workbench에서 인간 유전체 GRCh38.p7을 레퍼런스로 하여 매핑을 한 뒤 unmapped read를 모아서 후속 작업을 할 수도 있겠지만, metagenomic assembly는 외부 프로그램을 써야 하니 이를 export해야 한다. 파일의 수가 많으면 상당히 번거로운 일이 아닐 수 없다. 차라리 human genome sequence screen 등의 전처리를 아예 명령행 환경에서 하는 것이 낫다.

CLC Genomics Workbench의 Microbial Genomics Module을 써서 'de novo assemble metagenome' 기능을 실행할 수도 있지만, 내가 갖고 있는 버전은 너무 오래 되었다.

요즘 공부하고 있는 논문에서는 그저 Bowtie2를 이용하여 sequencing read를 인간 유전체 염기서열에 붙여서 제거하였다고만 간단히 기술하였다. SAM/BAM 파일을 만들어서 unmapped read를 추출하는 작업은 명령어 한 두 줄로 해결되지는 않는다. 좀 간단하게 할 방법은 없을까? 검색을 해 보니 이런 논문이 눈에 뜨인다.

Evaluation of methods for detecting human reads in microbial sequencing datasets. Microbial Genomics 2020; 6 DOI 10.1099/mgen.0.000393

매핑 후 Picard Tools를 써서 BAM 파일을 정제해야 하고, SAMtools view에 복잡한 파라미터를 넣어서 두 단계의 작업을 거치고... 할 일이 너무나 많다. 최적의 검출 방법을 결정하기 위한 연구 논문이니 이렇게 정성을 기울이는 것도 이해는 간다. 보다 심플한 방법이 없을까? 한참을 알아보다가 FastQC로 잘 알려진 Babraham Bioinformatics의 FastQ-Screen을 쓰기로 하였다. 일루미나 PE read는 BBduk과 BBmerge를 거쳐서 어댑터를 제거하고 fwd/rev read를 병합하여 사용하기로 했다.

Babraham Bioinformatics에서 개발하는 프로그램은 버전 번호를 올리는데 상당히 인색하다. FastQC는 2010년 v0.1에서 시작하여 지금은 v0.11.9이고, FastQC는 2011년 v0.1로 시작하여 현재는 0.14.0이다. NGS의 종말에 임박하면 비로소 v1이 되려는 것인지? 

FastQ-Screen은 Perl로 짜여진 프로그램이다. Reference genome을 내려받는 옵션이 있어서 실행해 보았지만 도무지 다운로드가 될 기미가 보이지 않아서 일루미나 iGenomes 웹사이트에서 인간 유전체 염기서열 자료만을 다운로드하였다. Configuration file에서 설정 가능한 genome database는 human, mouse, E. coli, PhiX, adapters, vectors의 여섯 가지. 여섯개의 DB를 다 적재한 상태에서 첫 번째 것에만 unique하게 매핑하고 나머지에는 하나도 붙지 않는 read만를 뽑아내려면 다음과 같이 명령어를 날리면 된다.

fastq_screen --tag --filter 100000 reads.fq.gz피

--filter 뒤에 오는 연속적인 숫자는 다음의 규칙에 의해서 만들면 된다.

  • 0: Read does not map
  • 1: Read maps uniquely
  • 2: Read multi-maps
  • 3: Read maps (one or more times)
  • 4: Passes filter 0 or filter 1
  • 5: Passes filter 0 or filter 2
  • -: Do not apply filter to this genome
'fastq_screen --tag --filter' 명령과 달리 'fastq_screen'으로 단순히 탐색적인 분석을 실시하면 10만 개의 read만 샘플링하여 사용한다. 매우 합리적인 선택이다. 하긴, CLC Genomics Workbench에서 read mapping 후 paired reads distance distribution을 산출할 때에도 모든 mapped read를 다 쓰지는 않는다. 

FastQ-Screen 전단계에서 어댑터 서열을 제거하므로, 본 분석 단계에서는 human genome을 걸러내는 일만 하면 충분할 것이다. 따라서 다른 genome DB를 다운로드하여 설치할 필요는 없다고 본다. 단, PE read를 투입한 경우 어느 한 read라도 human genome에 매핑이 되면 나머지 것도 제거하는 후처리를 거쳐야 하고, 최종적으로 read pair를 수선해야 된다. 이러한 post-process용 스크립트를 짜는 것이 숙제로 남았다. BBMap/repair.sh를 쓰면 될 것이다. 프로그램 개발자인 Brian Bushnell에게 감사를! 더불어 Babraham Bioinformatics의 생명정보학 트레이닝 과정 웹사이트에 빼곡하게 소개된 교육 자료에도 감동을 받았다.

Brian Bushnell의 최근 행적을 찾아보려다가 비교적 최근의 논문을 발견하였다. 어머, 이건 꼭 봐야 해!

DOE JGI Metagenome Workflow. mSystems 2021; DOI 10.1128/mSystems.00804-20

2022년 7월 5일 화요일

약 50분 분량의 강의 동영상 3개를 만들어 보았다

동영상 편집 자체에 익숙하지 못하므로 되도록이면 중간에 끊지 않고 길게 녹화를 하려고 무던히 애를 썼다. 하지만 특별한 '촬영 철학'이 있는 것이 아닌 상태에서 '원 테이크'로 길게 녹화를 한다는 것이 결코 쉬운 노릇은 아니다. 강연으로 먹고 사는 사람이 아닌지라 어색한 모습이 보임은 당연하다. 

화면 캡쳐에는 OBS Studio를, 촬영 후 편집에는 OpenShot Video Editor를 사용했다. 전부 무료 프로그램이고, 아는 소프트웨어는 그것 뿐이라서... 음성 녹음에는 롤랜드 사운드캔버스 SC-D70에 싸구려 다이나믹 마이크로폰을 연결하여 사용하였다. 음성 기록에는 전혀 손을 대지 않았다. 잡음을 없앤다거나 음량을 조정한다거나 하는 등 후처리가 필요하겠지만, 당장의 실력으로는 엄두가 나지 않는다. 내 얼굴을 찍는 웹캠의 높이와 마이크로폰의 각도 및 모니터 위치 등이 전혀 최적화가 되어 있지 않아서 약 네 시간 가까운 촬영을 끝내고 나니 목덜미가 뻐근하다. 새로운 녹음용 장비를 사야 되겠다는 욕심만 늘어났다. 가장 중요한 것은 마이크 스탠드. 집에 있는 탁상용 마이크 스탠드(Audiotrak AMS-11)는 USB 콘덴서 마이크 전용으로 쓰도록 하고, 자바라 형태의 스탠드를 따로 사도록 하자. 기왕이면 마이크도 하나 더...

주름져서 접을 수 있는 물건의 총칭인 '자바라'는 '뱀의 배'를 뜻하는 일본어에서 유래했다고 한다. 오, 그렇구나!(나무위키 링크)

OBS Studio로 화면을 기록할 때의 해상도는 메인 모니터의 그것과 같은 2560x1440 픽셀이었는데, OpenShot에서 편집을 마치고(편집이라고 해 봐야 끝을 조금 잘라내고 이어 붙인 것이 전부) 기본 프로파일로 '비디오 내보내기'를 하니 1024x576 16:9 PAL이 되었다. 너무 저해상도가 아닐까? 만약 터미널 창에 타이핑하는 모습을 제대로 기록하려면 글꼴을 더 키워야 한다. Windows Terminal에서 글꼴을 키우려면 어떻게 해야 하지? 검색을 통해서 알아보아야 한다.

Windows Terminal tips and tricks

공부할 것이 너무나 많다. 몇 시간짜리 강의를 하기 위해 해당 전문 분야의 지식을 축적해 놓는 것과는 차원이 다른 문제이다. 카메라와 마이크가 나를 향해서 작동 중인데, 어떻게 해야 부드럽게 나의 말을 이어 갈 것인가? 내 모습을 찍어서 계속 문제점을 파악해 보고, 연습에 연습을 거듭하는 것 말고는 방법이 없다. 스크립트를 미리 만들어서 이를 보고 읽으면서 녹화를 하고싶은 유혹은 언제나 있다. 그러나 이는 올바른 방법이 아니다. 정 필요하다면 몇 가지 핵심 단어를 적은 메모지를 앞에 놓고 슬쩍 보면서 머릿속에서 할 말을 즉각적으로 조립해 나가는 것이 진정한 '진행자'의 능력이다. 물론 메모지 넘기겠다고 손가락에 침을 발라서는 안 될 것이다.


컴퓨터를 이용한 녹음 작업에 늘 관심이 많았었는데 이번 일과 같이 구체적인 목표가 생기면서 실행에 옮기게 된 것을 매우 즐겁게 생각한다.


2022년 7월 1일 금요일

강의 동영상 만들기 준비 - 아파치 스트리밍 설정

무료 프로그램인 OBS Studio를 이용하여 컴퓨터 화면(파워포인트 강의자료 및 Windows Terminal) 녹화와 내 얼굴을 향한 웹캠 촬영을 동시에 실시하는 방법을 익혔다. 모니터는 두 대이므로 메인으로 사용하는 것 전체(2560x1440)을 기록하되 출력은 1280x720으로 맞추었고, 기록 파일은 default인 mkv가 아니라 mp4 포맷으로 만들었다.

연구용으로 사용하는 리눅스 서버(CentOS 7)에서 아파치를 통해서 스트리밍을 하려니 약간의 설정이 필요하다. 이것 역시 검색을 통하여 방법을 알아내었다. h264 모듈을 설치하는 것으로부터 시작한다. 그러려면 apxs(APache eXtenSion tool)이 먼저 깔려 있어야 한다. 'yum install httpd-devel pcre-devel'을 관리자 모드로 실행한다. 그러고 나서 다음과 같이 apache_mod_h264_streaming-2.2.7.tar.gz 패키지를 가져다가 압축을 풀고 설치한다.

wget http://h264.code-shop.com/download/apache_mod_h264_streaming-2.2.7.tar.gz
tar xvzf apache_mod_h264_streaming-2.2.7.tar.gz
cd mod_h264_streaming-2.2.7 
./configure
make
make install
...
Libraries have been installed in:
   /usr/lib64/httpd/modules

아파치 설정 파일 /etc/httpd/conf/httpd.conf를 열어서 다음 두 줄을 추가한다.

LoadModule h264_streaming_module /usr/lib64/httpd/modules/mod_h264_streaming.so
AddHandler h264-streaming.extensions .mp4

마지막으로 관리자 권한으로 아파치를 재시작한다.

systemctl restart httpd.service

허름한 html 문서를 만들어서 간단한 설명과 다운로드 및 스트리밍할 파일의 링크를 삽입한 뒤, 웹브라우저에 접속하여 테스트용으로 만든 mp4 파일을 클릭하여 보았다. 오디오 재생을 포함한 스트리밍 상태가 아주 양호하다. 연구소 방화벽 내에 존재하는 컴퓨터라서 보안 같은 것에 크게 신경을 쓰지 않았다. 이 동영상을 다운로드해 가면 또 어떠랴?

이것은 동영상 링크가 아니고 스크린샷 캡쳐 이미지이므로 클릭하지 마시길. 녹음은 Camac SM-221 + 롤랜드 사운드캔버스 SC-D70으로 하였다. Camac 다이나믹 마이크는 아주 오래 전에 이마트에서 구입한 것으로 가정용 노래방에나 어울리는 물건이다. 구글에서 모델명으로 검색하면 내가 쓴 글만 나온다(링크). 


같은 교재를 이용하여 오프라인 강의를 해 본 경험으로는 약 세 시간이 걸렸다. 이것을 실수 없이 녹화하여 몇 회 분량의 강좌를 만들려니 상당히 부담이 된다. 교직에 있는 사람들이라면 비대면 수업을 진행하면서 이러한 방식에 많이 익숙해졌겠지만, 강의를 본업으로 하지 않는 나에게는 쉬운 노릇이 아니다. 혼자서 컴퓨터 화면을 보면서 녹화용으로 강의를 한다는 것이 얼마나 어색한 일인지는 당연하지 않는가?

녹화 후 편집 작업은 일절 하지 않을 예정이므로(과연 그렇게 될지는 알 수 없음...자막을 넣을 일은 없느니까!) 일단 녹화 자체에만 집중해 보자. 녹화가 잘 되면 타이틀만 달아서 내 유튜브 채널에 올려 버릴까? 

취미용으로 갖추어 놓은 웹캠과 녹음용 장비(마이크 및 오디오 인터페이스 등)을 이런 용도로 쓰게 되리라고는 미처 예상하지 못했다. 당장 녹음을 하기에 불편함이 없을 수준의 장비를 갖추어 놓았음에도 불구하고 조금 더 좋은 품질의 다이나믹 마이크와 소형 믹싱 콘솔을 갖고 싶은 것은 도대체 무슨 욕심인지... 실은 MXL Temp USB 콘덴서 마이크로폰이 있으니 더 필요한 것은 없음에도 불구하고 믹싱 콘솔은 이상하게도 갖고 싶은 욕심이 사그러들지를 않는다.