ReplitでTesseractを導入する、discord.pyに実装する【2023年】

# 初めに

ReplitというオンラインIDEでdiscord.pyを使用してbotを作成していました。Tesseractを使いたくなり、導入しようとしましたが、Replitではsudoを実行する権限がないため、~~一般的な方法では導入することができませんでした。~~

追記：記事を書いている途中で検証していたら普通にできました...悲しい
もしこっちが出来なかったら是非一番下にある方法を試してみてください。

```bash:bash
pip install tesseract
pip install pytesseract
```
終わったら、バージョンを確認して成功しているか確かめます。
```bash:bash
tesseract --version
```
このとき、選択肢が２つ出てきますが上の方のtesseract.outを選択してエンターキーを押します。

また、ほかの記事にあった日本語データ置き換えはSHA256で確かめたところ標準のものと同じだったので必要なさそうです。


# pythonの書き方
せめてこの項だけでも見ていってください...

```python:main.py

#unq_nameはファイルに対する固有の名前
async def ocr(message, unq_name):
    try:
        await message.channel.send("処理中...")
        file_path = f"{unq_name}_ocr_raw.png"
        img = Image.open(file_path)
        img = img.convert("L")
        img = ImageEnhance.Contrast(img)
        img = img.enhance(2.0)
        custom_config = r"--psm 6"
        ocr_result = pytesseract.image_to_string(img, lang="jpn", config=custom_config)
        ocr_result = ocr_result.replace(" ", "")
        await message.channel.send(ocr_result)
    except Exception as e:
        print(f"Error: {e}")
        await message.channel.send("エラー")
        return None
```


一応ソースコードからビルドする方法も残しておきます。

<details><summary>ソースコードからビルドする古い方法</summary>



例えばsudoでコマンドを実行すると以下のエラーが出ます。
```
sudo: The "no new privileges" flag is set, which prevents sudo from running as root.
sudo: If sudo is running in a container, you may need to adjust the container configuration to disable the flag.
```
sudoなしで実行しようとしてもできません。
```
E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root?
```
そこで、今回はソースコードからビルドする手法を用いることにしました。今回導入するにあたってインターネットで調べても古いものや役に立たない情報ばかりで、解決法が見つからなかったので、ここに備忘録として残しておきます。

# 環境

2023年9月13日時点
|項目|バージョン
|:--|:--|
|OS|Ubuntu20.04.2 LTS|
|Python|3.10.11|
|Tesseract|5.3.2|
|pytesseract|0.3.10|
|Leptonica|1.84.0|

:::note warn
バージョンによっては導入できない可能性があります。
:::

# Leptonica
Tesseractを導入するのにのちのち必要となるので、先に準備しておきます。

ここで、今後使用するファイルと、メインプロジェクトが混乱しないよう、ディレクトリを分けておきます。私は以下のような構成にしました。(説明ではこの構造を用います)
##
- カレントディレクトリ(デフォルトでは/home/runner/{project name})
  - Packages
    - ここにいろいろ入れていく
  - メインプロジェクトもろもろ
  - main.py
  - ...
##
今後のコマンドはすべてReplitの標準Shell(bash)で行うものとします。
また、コマンドは一括で実行することもできますが、エラーのとき分かりにくいので念のため一行ずつ実行してください。

初めに、作成したディレクトリに移動してから、Leptonicaをgithubよりクローンします。

```bash:bash
cd Packages
git clone https://github.com/DanBloomberg/leptonica.git

```
ここからはbuild用のディレクトリで作業していきます。

```bash:bash
cd leptonica
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=$HOME/local ..
```
:::note warn
ここでlocalに指定しないと後でmake installするとき権限ではじかれます。
:::

このコマンドを実行すると、初回のみ以下のようになります。
```bash:bash
~/.../Packages/leptonica$ cmake -DCMAKE_INSTALL_PREFIX=$HOME/local ..
cmake: command not installed. Multiple versions of this command were found in Nix.
Select one to run (or press Ctrl-C to cancel):
> 
cmake.out
cmakeCurses.out
cmakeWithGui.out
cmakeMinimal.out
cmake_2_8.out
```
このように表示されるので、cmake.outが選択されている状態でエンターキーを押してください。すると、cmakeが開始します。

以下の表示が出ればcmakeは完了です。
```-- Build files have been written to: /home/runner/{project name}/Packages/leptonica/build```

ここで注意するのが、```Detected change in environment, reloading shell...```と表示されてしまいプロジェクトのディレクトリに戻ってしまいます。なので、buildディレクトリに戻ってください。
```bash:bash
cd /home/runner/{project name}/Packages/leptonica/build/
```

次にmakeをします。100%になるまで待機してください。

:::note warn
Replitの仕様上、ブラウザを開いていないとセッションが切れてしまうので気を付けてください。
:::

```bash:bash
make
```
以下の表示が出ればmakeは完了です。
```[100%] Built target leptonica```

makeが終わったら、make installをします。そんなに時間はかからないと思います。
```bash:bash
make install
```

これにてTesseractを導入する下準備は終わりです。


# Tesseract

ついに本命を導入していきます。まずは[GitHub](https://github.com/tesseract-ocr/tesseract/releases "https://github.com/tesseract-ocr/tesseract/releases")から最新のリリースを探し、ソースコードファイルのURLからファイルを取得します。そして、今はleptonica/build/にいるので、Packagesディレクトリに戻り、作業していきます。

```bash:bash
cd ../../

wget https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.3.2.tar.gz
```
このコマンドを実行すると、初回のみ以下のようになります。
```bash:bash
~/.../Packages/tesseract$ wget https://github.com/tesseract-ocr/tesseract/archive/refs/tags/5.3.2.tar.gz
wget: command not installed. Multiple versions of this command were found in Nix.
Select one to run (or press Ctrl-C to cancel):
> 
wget.out
busybox.out
```
このように表示されるので、wget.outが選択されている状態でエンターキーを押してください。すると、wgetが開始します。

先ほどと同様に```Detected change in environment, reloading shell...```と表示されるので、Packagesディレクトリに戻ってください。
```bash:bash
cd /home/runner/{project name}/Packages/
```

次に、先ほどwgetしたファイルを解凍します。ファイル名のバージョンは自身のものに合わせて変えてください。
```bash:bash
tar -xzvf 5.3.2.tar.gz
```
今回は自動でディレクトリが作成されるのでそこに移動します。
```
cd tesseract-5.3.2
```

先ほどと同様にbuild用のディレクトリで作業していきます。

```bash:bash
mkdir build
cd build
cmake -DLeptonica_DIR=/home/runner/{project name}/Packages/leptonica/build ..
```
:::note warn
ここで先ほどインストールしたleptonicaのパスを指定しないとエラーになります。
:::

以下の表示が出ればcmakeは完了です。
```-- Build files have been written to: /home/runner/{project name}/Packages/tesseract-5.3.2/build```

これでうまくいくはずですが、万が一失敗してしまった場合はbuildフォルダごと削除することでやり直すことができます。

```bash:bash
cd ../
rm -rf build
mkdir build
cd build
```

次にmakeをします。100%になるまで待機してください。

:::note warn
この手順にとても時間がかかります。私の場合は100分かかりました。
:::

```bash:bash
make
```
先ほどと同様進捗が100%になればmakeは完了です。

次にmake installをします。
```bash:bash
make install
```

ようやく導入完了です。お疲れ様でした。
以下のコマンドでバージョンが表示されたらインストール成功です。
```bash:bash
tesseract --version
```
</details>