見出し画像

備忘録 - 活字中毒者のライフハック (読み上げソフト編2)

小説家になろう作品を一気に聴きたい!

前回説明した上記の方法は、毎回投稿を追っかけていくにはそれなりの方法なんだけど、既に3桁とか投稿されている作品を初めから一気に聴く場合は手間が大きい。

何かいい方法は無いかなと考えていたら、メニューに"縦書きPDF”という項目が!

これでダウンドードしたPDFファイルは、その時点で作品の全投稿データーを含んでいて、なおかつPreview で開いてテキスト選択が可能なのでテキスト化が非常に簡単に行える。(OCR処理の必要が無い)

野望としてはPDFファイルをダウンロードし、テキスト化して say コマンドに読み上げてもらう又は say コマンドに音声データーファイルを生成してもらう。

ただこの場合、幾つか課題が…

課題たち

課題1 - ページ番号
縦書きPDFファイルには、ページ事にページ番号が付いている。
これが読み上げられると鬱陶しい…

課題2- ルビ
縦書きPDFファイルには、読み方・読み替え目的で小さくルビが振られている事がある。
これも読み上げられると鬱陶しい…

課題3 - say コマンドの最大入力制限
say コマンドが一度に受け付けられるデーターの最大値が決まっているらしく、これを超えると何もせずに実行終了してしまう。
ある程度の大きさで分割する必要がある。(ページ数とか行数とか…)

テストに使用したテキストファイルでは、8千行から9千行の間にこの制限が存在した。参考まで。

課題 4 - 読み間違い
say コマンドは日本語でもそれなりに読み上げ精度はあるのだけど、それでも読み間違いはそれなりにあって、出来るだけ精度を高めたい。
何か専用辞書があって鍛えられれば良いのだけど、色々検索してみてもヒットせず。

課題5 - 手順を少なくしたい
手作業でPDFダウンロードから、音声ファイル作成&実行までをおこなえるのだけど、出来るだけ手間を減らしたい。
目標はPDFファイルを選択すると、音声ファイル作成まで一気に行える環境。

課題対応

課題の1から3までは、Perl でスクリプト(say_large.sh) を作成して対応。

課題4については、sed コマンドで文字列変換をして、say コマンドに渡すようにした。ドキュメントフォルダに”sed_dic.txt" 置いて、誰でも辞書強化可能とした。
主人公名や主要単語が読み間違えられると悲しいので、簡単な登録を目指した。

課題5についてはAppleScript で組んだのだけど、ちゃんと動作する様にするにはマックの環境設定(Privacy&Security、ファイルアクセス権限)が知らない方には少々難しいかも

ルビ対応に対する言い訳…

PDFファイルではルビが振られている位置情報があるので、どれにルビが振られているかを知る事は可能なのだけど、テキスト化した時点でそういった情報は失われてしまう。
本来ならルビが振られた文字列をルビ文字列で置き換えられたら実装として美しいのだけれど、テキスト化された後では無理。
なので、ルビ情報自体を削除する方向で実装を行なった。

ルビ判断はかなり恣意的かつ機械的ロジックに基づいて実装している。
自分評価で98%程度は正しく除去できていると自負。

評価ロジック例
- ルビ文字列は、ひらがなかカタカナしかない。
- 複数候補があった場合は、短い方が多分ルビだろう…
- かっことかで囲まれた、内部文字が全てひらがなかカタカナで10文字以下なら多分ルビだろう…

今回縦書きPDFのルビ判断では、u2028 を区切りコードとして活用している。
これのおかげで、ルビ除去の正確性がかなり向上している。

手作業的フロー

下記の順でファイル生成を行なっていく。

PDF -> TEXT (sed)-> SAY (say)-> m4a
(SAY はsed で単語置き換え処理後&ブロック分割後の中間テキストファイル)

PDFファイルダウンロード

小説家になろうサイトにアクセスして、読みたい作品上部の”縦描きPDF”を選択する。

PDFファイルをテキストファイルに変換

ダウンロードしたPDFファイルをPreview で開き、select all (⌘a) & copy (⌘c) してテキスト情報をクリップボードにコピー

TextEdit を開いて、新規ドキュメント。
paste (⌘v) & save (%s)

注意: Rich Text ではなく、Plain Text モードにしてセーブ
(AppleScript での動作とちがって、手動でこの操作をすると何故か u2028 コードが抜けてしまう…  この説明の再現テストで発覚!)

単純にPDF からテキストに変換するだけなら他にもっと高速で確実な方法はあるのだけど、今の所上記の手順だけがu2028 コードが無くなる事なくテキストに変換可能な手順。

テキストファイルから音声データーを生成

% ~/Documents/say_large.sh ~/Downloads/daria.txt

テキストファイルと同じフォルダーに、拡張子 '.say' と '.m4a' 2種類のファイルが生成される。
元データーが大きくて分割する必要がある場合は、ファイル名の後ろに '_001' から始まる連番が付いた名前で生成される。

実行に必要なファイル

sed_dic.txt - 読み置き換え用sed 定義ファイル。下記Perl スクリプトと同じフォルダに置く必要あり。

内容は下記のように、漢字と読みをセットで定義するだけ。
正規表現を活用すればよりスマートに定義も行えるのだろうけど…

s/未曽有/みぞう/g
s/大嵐/おおあらし/g
s/厄介者/やっかいもの/g
s/類を見/るいをみ/g

注:変な所で行が切れると読み上げに影響が出るので、内部処理的にできるだけ文章を連結して不要な改行を排除している。
なのでg オプションは付けておいた方が良い。

say_large.sh - Perl で組んだテキストファイルから音声データーを作成するスクリプト。第一引数にテキストファイルを指定する。
テキストファイルと同じフォルダに、SAY, M4A ファイルを作成する。

ー> 上記sed_dic.txt ファイルを同じフォルダーに置く事。
(無ければヌルファイルを作成するのでエラーにはならないけど…)
ー> 下記アップルスクリプトと同じフォルダか、ドキュメントフォルダに置いてある事が必要。

v_read.scpt - PDFファイルを選択するだけで、音声ファイル作成&再生までを自動的に行えるAppleScript ファイル。OS側での環境設定が少々面倒なのが難点。

現在の設定

分割はPerlスクリプトファイル内の下記定数定義で制御している。

use constant MAX_PAGES => 200;    # 200ページ毎に分割
use constant MAX_LINES => 4000;   # 4000行毎に分割
my $pitch_param = " -r 190 "; # say コマンドピッチパラメーター設定値

大体のケースでは先にページ数上限に達する感じ。
攻めた設定で、400 ページ(8000行)位までならいけるかも。

この設定で、.say ファイルは大体300-400KB 、.m4a ファイルは 400-500MB 程度の大きさになる。
音声の再生時間としての目安は3時間前後。

こうして作成した音声データーをBGM的に、他の作業時や就寝時に聴く事で時短になっている感じ。

作成後の感想…

まだ色々と修正中ではあるのだけど、まあまあ使えるレベルにはなっているかなという感じ。

音声データー作成は1ブロックだけで10分以上要したりするので、もう少し速度を上げられたらとも思う。

最初の頃並列にコマンド実行していていたら、音声データー作成途中でハングアップするプロセスが続出し、順次実行に戻したという経緯もある。

また今も時々音声出力処理がハングアップする事があって、リトライすると完了したりするので、原因がいまいちつかめない。
一度に行う処理データーサイズを小さくしても改善されなかった。

今後の展望

say コマンド…

それにしても、say コマンドの機能の少なさが辛い。
下記程度しか無いらしい。

# - say制御構文
#[[ slnc 5000 ]] : silence for 5s.
#[[volm 0.9]] changes the volume to the indicated level.
#[[volm +0.1]] increases the volume by the indicated level.
#[[rate 150]] changes the speed
#[[pbas 50]] changes the pitch.
#[[ rset ]] resets all these parameters to default
#‘word’ :quotes also put the emphasis on the word.

生成される音声も理解可能なレベルではあるけれど、自然さという意味では程遠い

質問文(?で終わる)で語尾を上げたりとか、抑揚制御ができればなぁ…

AIベースの読み上げツールへの期待

AI技術を使った自然な感じの読み上げ可能なツールも色々とリリースされている様なので、今回の様な用途にあったものがあれば試してみたいかな。

実行ファイル3

今回作成したスクリプト類を下記にアップ。

全てドキュメントフォルダー内に置く事を推奨。
お好みにより自由に改変してみて。

実行確認環境: MacMini M2 Pro(16GB, 512GB)、 Sonoma 14.4.1、 Perl v5.34.3 (sed その他内部使用コマンドはMacOS標準)

 


この記事が気に入ったらサポートをしてみませんか?