« ^ »

今日やった事 - 20240822

所要時間: 約 4分

今日は大雨が降っている。外で活動する事が多いから、こういう日は身動きた取りにくくなる。

やることリスト

  • コメントの部分を確認する。
  • プルリクエストをレビューに出す。
  • v2のコメント返信して投げ返す。
  • speech-to-speech-japaneseを試す(環境構築)
  • v2を読む。
  • speech-to-speech-japaneseを試す(実行)

組版されたPDFの査読作業を改善する

今まではEmacsの拡張であるpdf-toolsの機能を使い、PDF内の文字列を抽出し、それを say コマンドに渡す事で読み上げをしながら査読作業を行っていた。

このやり方については、そこそこ気に入っているのだけれど、各ページ毎にテキストを抽出し、その一部を指定して読み上げさせるため、操作が多くなりがちだった。そのため、操作は少なくある程度自動で読み進められるような状態にしたいと考えていた。もし、それができれば、文章を聞く時間をもっと長く確保でき、そのぶん品質向上が望める。

以前はEmacsを起点に考えていたが、今回はCLIをベースに考えていきたい。

まずPDFの特定の範囲の文字を抽出する必要がある。これにはPopplerを使う事にした。PopplerはCで実装されたPDF用ライブラリだ。Emacsのpdf-toolsも、このPopplerを利用している。もしPopplerをまだインストールしていなければ、事前にインストールしておく。

brew install poppler

Popplerにはpdftotextというコマンドが付属しており、これはPDFから文字を抽出する。

pdftotext -f 35 -l 37 test.pdf -

このコマンドを実行すると、test.pdfの35ページから37ページまでの文字列を抽出する。コマンドの最後の - の指定によって、結果は標準出力に書き出される。

抽出された文字列は、余計な空白が含まれていたり、全ての文章を連結すると文が長くなりすぎて say コマンドで処理しきれないなど、そのままでは使えない。そこで、抽出された文字列をMeCabを使って形態素解析し、必要に応じて1つの文を組み立て、句点が登場する度に say コマンドに渡すようにする。

MeCab及び辞書をインストールする。辞書はipadicを使う事にした。

brew install mecab
brew install mecab-ipadic

Pythonの仮想環境を作成し、そこにMeCab関連のパッケージをインストールする。

pip install mecab-python3
pip install ipadic

これらのプログラムを使い、標準入力から受け取ったデータを上手く受け流すスクリプトを実装する。

import MeCab
import ipadic

tagger = MeCab.Tagger(ipadic.MECAB_ARGS)
node = tagger.parseToNode(sys.stdin.read())
sys.stdin.read()

sentence = ""
while node:
    word = node.surface
    feature = node.feature.split(",")

    hinshi = feature[0]
    detail = feature[1]

    if hinshi == "記号" and detail == "句点":
        with subprocess.Popen(["/usr/bin/say", "--rate", "250"],
                              stdin=subprocess.PIPE,
                              text=True) as p:
            p.stdin.write(sentence)
        sentence = ""
    else:
        sentence += word
    node = node.next
pdfreader.py

これらを繋げて読み上げを実行する。

pdftotext -f 35 -l 35 example.pdf - | python pdfreader.py

適度に分割された形で、読み上げが行われるようになった。

  • 読み上げながら見る。
  • 指摘事項としてコメントを入れられる。
  • AIが自動的に校閲を行う。

Emacsのearly-init.elには何を記述するべきか

early-init.elはinit.elよりも早い段階で読み込まれる。それぞれに何を記述するのかを考えるために、Emacsの起動プロセスについてまとめる。

  1. 起動オプションを解析する。
  2. early-init.elを読み込む。
  3. 環境変数と初期設定を読み込む。

    • デフォルト設定を読み込む。
    • ユーザーのロケール情報を設定する。
  4. スクラッチバッファ(*scratch*)が設定される。
  5. init.elを読み込む。
  6. custom-fileを読み込む。

    • Emacsのカスタマイズインターフェースを記述、保存したファイル。
  7. フレームを初期化する。
  8. after-init-hookを実行する。
  9. 初期バッファを表示する。

early-init.elは、パッケージシステムの初期化や一部のUI要素(ツールバーやスクロールバーなど)の設定を行うために使われる。