Skip to content

Instantly share code, notes, and snippets.

@sasasin
Last active January 9, 2024 01:05
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sasasin/afd806084e23e87416576061a8b18ed0 to your computer and use it in GitHub Desktop.
Save sasasin/afd806084e23e87416576061a8b18ed0 to your computer and use it in GitHub Desktop.
EPUB を mp4 に変換するやつ
#!/bin/bash -ve
set -o pipefail
# EPUB ファイルをチャプター毎の mp4 ファイルに変換するシェルスクリプト
## 依存関係
# brew install w3m が必要
# unzip で、EPUBファイルからコンテンツ抽出
# find, sort で、EPUBファイル内にあるXHTMLファイルをリストアップ
# w3m で、XHTMLファイルからHTMLタグを除去し txt に変換
# say コマンドで txt から mp4 ファイルに変換
## 音声設定
# say コマンドの、システムの声、読み上げ速度などは、
# macOS システム環境設定 -> アクセシビリティ -> 読み上げコンテンツ
# にて調整する必要がある。
# say コマンドのCLIオプションは、日本語には効かないようだ
## 入力
# コマンドライン引数で EPUB ファイルパスを渡す
EPUB_FILE_PATH="$1"
EPUB_FILE_NAME="$(basename -s .epub ${EPUB_FILE_PATH})"
## 出力
# 勝手に場所を掘ります
WORK_DIR="$HOME"/tmp/"${EPUB_FILE_NAME}"
rm -rf "${WORK_DIR}"
# この場所に mp4 が転がります
mkdir -p "${WORK_DIR}/mp4"
cp ${EPUB_FILE_PATH} "${WORK_DIR}"/
cd "${WORK_DIR}"
unzip "${WORK_DIR}"/"${EPUB_FILE_NAME}".epub
# 並列で変換しようと思ったが、オライリーの400ページ級の技術書が、20分程度で変換できた。
# がんばって並列にせんでも、十分実用に耐える速度であるように思った。
# 多量の EPUB ファイルを並列変換したいのなら、このシェルスクリプト自体を並列稼動させればよい。
find . -type f -name "*.xhtml" \
| sort -u \
| while read EPUB_XHTML_FILE_PATH; do
EPUB_XHTML_FILE_NAME="$(basename -s .xhtml ${EPUB_XHTML_FILE_PATH})"
EPUB_MP4_FILE_PATH="${WORK_DIR}/mp4/${EPUB_FILE_NAME}.${EPUB_XHTML_FILE_NAME}.m4a"
echo "${EPUB_MP4_FILE_PATH}"
cat "${EPUB_XHTML_FILE_PATH}" \
| w3m -dump -T text/html -cols 5000 \
| say --file-format "m4af" --data-format "alac" -o "${EPUB_MP4_FILE_PATH}" --progress
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment