<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>БЯМ on Hatred&#39;s Log Place</title>
    <link>https://htrd.su/tags/%D0%B1%D1%8F%D0%BC/</link>
    <description>Recent content in БЯМ on Hatred&#39;s Log Place</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ru</language>
    <managingEditor>adrozdoff@gmail.com (Alexander Drozdov)</managingEditor>
    <webMaster>adrozdoff@gmail.com (Alexander Drozdov)</webMaster>
    <lastBuildDate>Sat, 04 Jul 2026 12:29:15 +1000</lastBuildDate>
    
        <atom:link href="https://htrd.su/tags/%D0%B1%D1%8F%D0%BC/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>OCR с помощью БЯМ и подготовка EPUB</title>
      <link>https://htrd.su/blog/2026/07/04/llm_ocr_processing/</link>
      <pubDate>Sat, 04 Jul 2026 12:29:15 +1000</pubDate>
      <author>adrozdoff@gmail.com (Alexander Drozdov)</author>
      <guid>https://htrd.su/blog/2026/07/04/llm_ocr_processing/</guid>
      <description>&lt;p&gt;Потребовалось мне закачать в читалку в телефоне несколько исторических книжек. Да вот беда: все они доступны только в PDF или Djvu различного уровня паршивости сканирования. Если читать глазами - ещё куда ни шло. Но если подсунуть текст автоматическому чтецу, то будет фиаско.&lt;/p&gt;
&lt;p&gt;У одной книжки был текстовая подложка. Распознование очень плохое. Внутри документа встречаются HTML теги. И тут решил попробовать модные ныне LLM на предмет обработки текст. Придумал запрос, залил файл и&amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ChatGPT - фиаско. Ну он начинает, выдаёт порцию (документ текстовый почти на 2 Мб) далее опять просит загрузить файл.&lt;/li&gt;
&lt;li&gt;Qween - тоже не справился&lt;/li&gt;
&lt;li&gt;DeepSeek - а вот он оказался кросавчегом! Про залитый файл не забывает, но может сбойнуть. Ну и выводит только в чат.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Результирующий текст получился очень годным плюс форматирование в Markdown. А по сути нужно было:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;убрать очевидные ошибки OCR&lt;/li&gt;
&lt;li&gt;склеить строки&lt;/li&gt;
&lt;li&gt;понять где заголовки и новые параграфы&lt;/li&gt;
&lt;li&gt;убрать колонтитулы&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Как следствие, решил проверить на самой паскудно-отсканированной книге, где картинки в PDF.&lt;/p&gt;
&lt;h2 id=&#34;процедура-обработки&#34;&gt;Процедура обработки&lt;/h2&gt;
&lt;p&gt;Для начала нужно извлечь картинки из документа.&lt;/p&gt;
&lt;p&gt;Для PDF:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir OCR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; OCR
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pdftoppm ../Document.pdf out
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;будет создано куча файлов вида &lt;code&gt;out-xxx.ppm&lt;/code&gt;. Есть вариант и &lt;code&gt;pdftopng&lt;/code&gt;, почему-то воспользовался первый. Сейчас бы воспользовался вторым.&lt;/p&gt;
&lt;p&gt;Для Djvu:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ddjvu -format&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ppm ../Document.djvu -eachpage out-%03d.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Первая страница обычно обложка, сразу стоит сохранить её как title.png:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;magick out-001.ppm ../title.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# или&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cp out-001.png ../title.png
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Далее, упрощения жизни распозавальщику, если книга отсканирована или отфотографирована в виде разворота, то крайней желательно разделить на стриницы, поможет ImageMagick:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir split
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; split
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; i in ../*.png&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;nm&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;basename &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; .png&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; magick &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; -crop 50%x100%  &lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;nm&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;_%d.png&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Стоить перепроверить отдельные страницы, что не порезался текст и им поправить пропорции резки вручную.&lt;/p&gt;
&lt;p&gt;Теперь очередь Tesseract. Для его запуска сделал вспомогательный скрипт &lt;code&gt;ocr-tesseract-my.sh&lt;/code&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/usr/bin/env bash  
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -e  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;#set -x  &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;IN&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;dirname &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$IN&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;BASE&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;basename -- &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IN&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;%.*&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OCR_LANG&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;rus  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;OUT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;DIR&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;BASE&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;_out&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PSM&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;OCR: &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$IN&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tesseract --psm &lt;span class=&#34;nv&#34;&gt;$PSM&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$IN&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$OUT&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; -l &lt;span class=&#34;nv&#34;&gt;$OCR_LANG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Запуск на файлах (далее допускаю, что работаем с PNG):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; i in *.png&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; ocr-tesseract-my.sh &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;А результат уже собрать в один документ:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -f out.txt&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; i in *.txt&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;do&lt;/span&gt; cat &lt;span class=&#34;nv&#34;&gt;$i&lt;/span&gt; &amp;gt;&amp;gt; out.txt&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;done&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Вот &lt;code&gt;out.txt&lt;/code&gt; и будет тем самым полуфабрикатом, который мы подсунем DeepSeek.&lt;/p&gt;
&lt;h2 id=&#34;deepseek&#34;&gt;DeepSeek&lt;/h2&gt;
&lt;p&gt;Загружаем файл &lt;code&gt;out.txt&lt;/code&gt; и я сформулировал такой набор требований:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Вот текстовый файл
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; Соединить строки, убрать знаки переноса по смыслу
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; Заменить HTML символы типа &amp;amp;amp; заменить на печатные аналоги
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; Заменить HTML символы типа &amp;lt;hr&amp;gt; на двойной перевод строки
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;4.&lt;/span&gt; Заменить HTML символы типа &amp;lt;br&amp;gt; на одинарный перевод строки
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;5.&lt;/span&gt; Строки набранные CAPS LOCK считать заголовками. Так же попытаться выделить заголовки по смыслу. Например: короткое предложение без точки в конце на отдельной строке, а продолжение текста с большой буквы
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;6.&lt;/span&gt; Определять по смыслу начало параграфа, отделять пустой строки: тут сложность: по смыслу понять: после перевода строки продолжается строка и просто нужно соединить и, возможно, убрать знак переноса, или это новое предложение или параграф. Если сомневаешься, не делай параграф.
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;7.&lt;/span&gt; Исправить очевидные OCR шибки
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;8.&lt;/span&gt; Убрать колонтитулы, номера страниц
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;9.&lt;/span&gt; Форматировать в Markdown с отформатированным выводом в чат
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Результат выдавать в чат порциями по 64кб, далее ждать команды на продолжение.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Последнее уточнение родилось из-за того, что на одном документе DeepSeek аварийно завершал обработку и пропадал весь вывод. Мне показалось куда надёжнее, просить порцию, сохранять её, если пошло что-то не так, то разбираться именно с текущим чанком. Запрос следующего чанка - это отправка текста &amp;ldquo;далее&amp;rdquo; в чат.&lt;/p&gt;
&lt;p&gt;Процесс не быстрый. Возможно, на платных подписках будет шустрее, но результат мне понравился. Стоит отметить, что не всегда он начинает давать ожидаемое форатирование. Решается путём остановки и переотправки запроса, как есть, без правки. У меня со второй или третьей попытки начинал выводить форматированный Markdown, который при копировании давал что-то вроде:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gh&#34;&gt;# Как начинался Владивосток
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gs&#34;&gt;**А.И АЛЕКСЕЕВ**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;## Содержание
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;После этого шага получается вполне себе годный Markdown документ. Теперь можно, по желанию, расставить вручную картинки, но моя задача этого не требовала.&lt;/p&gt;
&lt;p&gt;Как я писал выше, процедура изначально была прогнана на документе самого плохого качества сканирования. И он блестяще справился. Вот наглядный пример, что было на входе:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-txt&#34; data-lang=&#34;txt&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;В книге, по,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;и ПОдГотовленной к юби-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;лею Впдди.оае›н, его — 125-ле-
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;тию, рассказывается ©
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;шёегах нового горо,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;›да Росси
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Редины прошпого вна аи -
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;дены  портреты его. основателей
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;от адмиралов и генералов до
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;дивостока, ставшего для всех нас
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Родным, города, в котором мы
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;сегодня живем и трудимся,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;40 коп.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;И результат:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;В книге, подготовленной к юбилею Владивостока, его 125-летию, рассказывается о первых днях и годах нового города, о том, как начинался Владивосток. Автор воссоздал картины далекого прошлого, показал портреты его основателей — от адмиралов и генералов до первых поселенцев Владивостока, ставшего для всех нас родным городом, в котором мы сегодня живем и трудимся.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;А что было по факту:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;В книге, подготовленной к юбилейю Владивостока, его 125-летию, рассказывается о первых шагах нового города России середины прошлого века. В ней даны портреты его основателей от адмиралов и генералов до матросов и солдат, положивших свой камень в фундамент Владивостока, ставшего для всех нас родным, города, в котором мы сегодня живём и трудимся.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Видно, что текст домыслен. Но смысл не утерян. Учитывать это стоит и всё таки искать качественный источник данных для OCR.&lt;/p&gt;
&lt;h2 id=&#34;epub&#34;&gt;EPUB&lt;/h2&gt;
&lt;p&gt;Для подготовки EPUB использовал pandoc. Для начала в Markdown документ добавил front-matter с 
&lt;a href=&#34;https://pandoc.org/demo/example33/11.1-epub-metadata.html&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;метаданными книги&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;title: 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; type: main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  text: ВЛАДИВОСТОКЪ
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; type: subtitle
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  text: ЭТЮДЫ К ИСТОРИИ СТАРОГО ГОРОДА
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;author: А. А. Хисамутдинов
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;publisher: Private Publishing
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cover-image: title.png
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Тут нам и пригодилась сохранённая ранее обложка: её будем использовать для EPUB.&lt;/p&gt;
&lt;p&gt;После всего этого достаточно запустить:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-sh&#34; data-lang=&#34;sh&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pandoc Document.md -o Document.epub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;и книжка - ваша.&lt;/p&gt;
&lt;h2 id=&#34;выводы&#34;&gt;Выводы&lt;/h2&gt;
&lt;p&gt;ЛЛМ могут реально помогать. Особенно в нехарактерных для постоянного использования задач. Но относиться нужно с осторожность (чего стоит только домыслевание непонятного текста, пример о чём был выше). Как минимум я бы поостерёгся использовать данный подход к текстам с формулами (но я слабо представляю, как такие тексты вообще слушать как аудио-книги). Да и в текущем виде по хорошему нужна вычитка и проверка дат, фамилий и географических названий. Но в целом, результатом для себя я крайне доволен!&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
