Beş saniyelik sessizlik

Şili'den bir okur kaydoldu, Angeles Durini'nin "¿Quién le tiene miedo a Demetrio Latov?" adlı çocuk romanının 74 sayfalık PDF'ini yükledi ve Sesli kitap oluştur'a tıkladı. On beş saniye sonra bir e-posta düştü: "Sesli kitabınız hazır."

Hazır değildi. Dosya yalnızca 5,6 saniye uzunluğundaydı. İçinde hiçbir şey yoktu.

Bu, sadece canlı ortamda yakalayabileceğiniz türde bir hatadır, çünkü o zamana kadar kullandığımız test PDF'lerinin hepsinde gömülü metin vardı. Onunkinde yoktu. Kitap 2012'de Adobe Acrobat Pro ile sayfa sayfa taranmış ve her sayfa görüntü olarak saklanmıştı. Bizim pipeline'ımıza göre bu PDF, 74 boş sayfaydı.

Önemli çıkarım: Bir PDF tarama olduğunda (yalnızca görüntü, gömülü metin katmanı yok), yapay zekâ destekli sesli kitap üreticilerinin çoğu sessizce boş ya da anlamsız ses üretir. Gerçek metin çıkarımı için OCR gerekir — ve neredeyse hiçbir sesli kitap aracı bunu varsayılan olarak çalıştırmaz.

Taranmış PDF'ler sesli kitap pipeline'larını neden bozar?

Bir PDF metni tamamen farklı iki şekilde taşıyabilir:

Düz yataklı bir tarayıcıdan, telefon kamerasından ya da eski bir sayısallaştırma projesinden (Google Books, archive.org, kamu malı yeniden basımlar, ikinci el çocuk kitapları düşünün) gelen her şey büyük ihtimalle ikinci türdür. İnsan gözüne aynı görünürler. Yazılıma göre ise radikal biçimde farklıdırlar.

Başarısız yüklemeyi incelediğimizde, PDF ayrıştırıcımızın 74 sayfalık kitabın tamamı için yalnızca 17 karakterlik çöp — harfler değil, kontrol baytları — döndürdüğünü gördük. Pipeline da bu 17 baytı sadakatle metin-konuşma motoruna verip 5 saniyelik mırıldanan bir çıktı üretti. Sonra da okura sesli kitabının hazır olduğunu bildiren bir e-posta gönderdi.

Ne inşa ettik?

Çözüm kavramsal olarak basit: bir PDF'in kullanılabilir metni olmadığını tespit et, sonra her sayfayı OCR'dan geçir. Uygulama tarafında anlatmaya değer birkaç parça var.

1. Seyrek metin dedektörü

Her yükleme için doğrudan OCR'a dalmadan önce, yerel metin çıkarımının sonucunu kontrol ediyoruz. PDF'in tamamı 200'den az karakter döndürdüyse ya da 4 ve daha fazla sayfada sayfa başına ortalama 30 karakterin altında kalındıysa, dosyayı tarama olarak kabul edip OCR yoluna geçiyoruz. Normal metin PDF'leri — yani vakaların %90'dan fazlası — bu yavaş yolu hiç tetiklemiyor.

2. pypdfium2 + tesseract (baştan sona Apache 2.0)

Her sayfayı pypdfium2 (Google'ın PDFium motorunun Python sarmalayıcısı, Apache 2.0) ile 2,5× ölçekte — yaklaşık 180 DPI, güvenilir karakter tanıma için yeterli — render ediyoruz. Her görüntü, çok dilli bir modelle yüklenmiş tesseract'tan geçiyor: eng+spa+por+fra+deu+pol+ita+tur. Tesseract gerçek dili glif şekillerinden kendisi çözüyor.

PyMuPDF'i — Python'un en popüler PDF kütüphanesini — bilinçli olarak bıraktık çünkü AGPL lisansı, barındırılan bir servis için sancılı. pypdfium2'ye geçiş bir öğleden sonramızı aldı ve hukuki uçurumu tamamen ortadan kaldırdı. Ticari bir ürün için PDF tabanlı bir şey kuruyorsanız bunu bilmenizde fayda var.

3. Otomatik dil tespiti

Okurun kitabı İspanyolca'ydı ama arayüz dili İngilizce — yani düzeltmemizden önce, OCR çalışmış olsaydı bile pipeline İspanyolca metni İngilizce bir sesle sentezleyecekti (robotik, yanlış telaffuzlu). Şimdi dil tespitinin kendisi OCR'lanmış metni kullanıyor. 3 örnek sayfanın ardından langdetect içeriği sınıflandırıyor ve doğru sesi seçiyor — bu örnekte Latin Amerika İspanyolcası.

4. Dürüst hata yolu

OCR yine de 100 karakterden azını kurtarabiliyorsa (yalnızca dekoratif PDF'ler, bozuk dosyalar), sessizlik üretmek yerine artık net bir hata fırlatıyoruz: "Bu PDF'ten çıkarılabilir metin yok. Lütfen bir EPUB, TXT ya da metin tabanlı bir PDF yükleyin." Sesli kitap işi başarısız olarak işaretleniyor, e-posta gönderilmiyor, kredi düşülmüyor.

Taranmış bir PDF'iniz mi var? Şimdi deneyin.

MimicReader, ayda ilk bir saatlik ses için ücretsizdir. Kart gerekmez. Herhangi bir PDF atın — metin ya da taranmış — gerisini biz hallederiz.

Ücretsiz başla

Sonuç

Okurun PDF'ini yeniden inşa edilmiş pipeline'dan tekrar geçirdik. Beş dakikalık OCR, onun 74 taranmış sayfasından 144.710 karakter temiz İspanyolca çıkardı. Ardından pipeline metni 1.127 parçaya böldü ve okuma senkronizasyonlu — sese bağlı kelime kelime vurgularla — 2 saat 43 dakikalık bir sesli kitap üretti. Ona İspanyolca bir e-posta gönderdik, masraflar bizden, ve ilk denememiz için özür diledik.

Yeniden üretmenin tamamı yaklaşık 90 dakikalık duvar saati zamanı aldı: yaklaşık 5 dakika OCR, 80 dakika metin-konuşma, birkaç dakika ses normalleştirme (EBU R128) ve M4A finalizasyonu. Bu, bir metin PDF'inden daha yavaş — ama çalışıyor. Eskiden hiç çalışmıyordu.

Bir raf dolusu taramanız varsa bu ne anlama gelir?

Eski yeniden basımlar, baskısı tükenmiş romanlar, archive.org'dan kamu malı sayısallaştırmalar, büyükannenizin yemek kitabının kendi taradığınız nüshası — taranmış kitap biriktiriyorsanız, artık kâğıtta sıkışıp kalmış değiller. Yükleyin. OCR'ı biz yapacağız.

Şu anda 12 dilde OCR yapıyoruz: İngilizce, İspanyolca, Portekizce, Fransızca, Almanca, Lehçe, İtalyanca, Türkçe, Arapça, Japonca, Korece, Hintçe. Sesli kitabın kendisi 23 ses dilinin herhangi birinde üretilebilir. Taranmış kitabınız henüz OCR yapmadığımız bir dildeyse, bize yazın — bir tesseract dil paketi eklemek birkaç dakika alıyor.

Ticari lisans hakkında bir not

Kullandığımız tüm OCR yığını — tesseract, pypdfium2, pytesseract — Apache 2.0. Benzer bir şey kuruyorsanız bu önemli: PyMuPDF, Python'da PDF render etmek için kolay seçimdir ama AGPL lisansı, üretimde kullanırsanız tüm SaaS'inizi açık kaynak yapmanızı zorunlu kılar. pypdfium2 + tesseract, lisans baş ağrısı olmadan aynı yetenekleri sunar.

Bizi daha iyi yapan hata

Üretim hatalarının çoğu testte yakalanır. Bu yakalanmadı, çünkü "PDF'lerin içinde metin vardır" varsayımı, o zamana kadar kullandığımız her geliştirici dosyası için geçerliydi. Bunu yüzeye çıkarmak için Şili'den gerçek bir okurun, platformdaki ilk saatinde olması gerekti.

O yüzden teşekkürler, gerçek okurlar. Bizim yakalayamadığımız hataları siz buluyorsunuz.