[PYTHON] Faites-leur lire lentement l'Aozora Bunko: plus précisément

La dernière fois a réussi à lire lentement l'Aozora Bunko en utilisant Python. Cependant, comme je l'ai lu sans considérer ruby, il y avait un problème que la précision de lecture était assez faible. Cette fois je vais corriger ce point

Ce flux

Ce que je veux faire ** Si vous lancez l'URL d'Aozora Bunko, elle sera lue lentement après avoir été enregistrée dans le dictionnaire de lecture **. Par conséquent, nous allons créer le flux suivant

Untitled Diagram.png

Obtenez l'URL du fichier à partir de l'URL de la fiche du livre

Il existe une page appelée carte de livre dans Aozora Bunko, à partir de laquelle vous pouvez accéder à la page Web contenant le texte et télécharger divers fichiers.

tosyoka-do.PNG

Cette fois, je veux zip et xhtml à partir des fichiers inclus en rouge, donc j'utiliserai BeautifulSoup4 pour les obtenir.

aozora_urlsplit.py


from bs4 import BeautifulSoup
import requests
import re

def aozoraurl(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')

    table = soup.select('table.download a[href*=".html"]')
    htmlurl_rel = str(table).split('\"')[1].replace("./", "/")
    #Obtenir le chemin relatif de XHTML

    table2 = soup.select('table.download a[href*=".zip"]')
    zipurl_rel = str(table2).split('\"')[1].replace("./", "/")
    #Obtenez le chemin relatif du fichier zip

    urlsplit = re.sub("/card[0-9]*.html", "", url)
    htmlurl = urlsplit + htmlurl_rel
    zipurl = urlsplit + zipurl_rel
    aozoraurllist = [htmlurl, zipurl]
    #Coupez sous la carte de l'URL saisie et attachez-la au chemin relatif ci-dessus

    return aozoraurllist

if __name__ == '__main__':
	print(aozoraurl("https://www.aozora.gr.jp/cards/000879/card85.html"))

Si vous lancez l'URL de la page de la fiche du livre, celle-ci renverra la liste des [URL XHTML, URL zip].

Faites une liste de rubis

Créer une liste de rubis à partir de XHTML

aozora_rubylisting.py


from bs4 import BeautifulSoup
import requests
import re
import jaconv

def aozoraruby(url):
    page = requests.get(url)
    soup = BeautifulSoup(page.content, 'html.parser')

    _ruby = soup.select("ruby")

    _rubylist = []
    for i in _ruby:
        _ruby_split = re.sub("<[/a-z]*>", "", str(i)).replace(")", "").split("(")
        _rubylist.append(_ruby_split)

    for index, item in enumerate(_rubylist):
        _rubylist[index][1] = jaconv.kata2hira(str(item[1]))
    
    return _rubylist

if __name__ == '__main__':
	print(aozoraruby("https://www.aozora.gr.jp/cards/000879/files/3813_27308.html"))

Puisque SofTalk ne peut être lu et enregistré qu'en Hiragana, Katakana sera converti en Hiragana.

J'ai utilisé ʻenumerate` pour la première fois cette fois, et c'est intelligent et bon.

Créer un corps à partir d'un fichier txt

Comme la dernière fois, je vais emprunter à Je veux obtenir le texte d'Aozora Bunko en Python - AI Artificial Intelligence Technology.

Si vous lancez l'URL à la fonction download (), le corps sera renvoyé par la fonction convert (). Puisque la fonction main () n'est pas utilisée, placez-la sous ʻif name == '__ main __': `

Enregistrement et lecture lents du dictionnaire

aozora_yukkuri.py


import subprocess
import os

from aozora_urlsplit import aozoraurl
from aozora_rubylisting import aozoraruby
from aozora_honbun import download, convert

os.chdir(os.path.dirname(os.path.abspath(__file__)))

urllist = aozoraurl("https://www.aozora.gr.jp/cards/000879/card3813.html")

_ruby = aozoraruby(urllist[0])
_honbun = convert(download(urllist[1])).splitlines()

_start = "start SofTalk.Chemin exe"
_pron  = "/P:"
_speed = "/S:120"
_word  = "/W:"

for j in _ruby:
    _command_ruby = [_start, _pron + j[1] + "," + j[0] + ",True"]
    print(_command_ruby)
    subprocess.run(' '.join(_command_ruby), shell=True)

for i in _honbun:
    _command = [_start, _speed, _word + i]
    subprocess.run(' '.join(_command), shell=True)

Placez le texte dans la liste pour chaque saut de ligne et effectuez de l'enregistrement du dictionnaire à la lecture du texte.

Si vous voulez changer votre voix lentement, ajoutez / M: ou / MN: à _command (référence [^ dai1kai])

Problèmes connus

Le texte et le rubis proviennent de différents endroits

Le corps est tiré de txt (zip) et le ruby est tiré de la version XHTML car je souhaite utiliser le code existant. Je pense que le texte devrait être unifié à la version XHTML à l'avenir (car il semble assez difficile de supprimer ruby de txt)

Caractères kanji qui n'ont pas été enregistrés dans le dictionnaire

Dans Aozora Bunko, il semble que les kanji difficiles comme l'image ci-dessous soient affichés sous forme d'image. Il est difficile de lire ceci, il est donc bon de sauter l'enregistrement du dictionnaire et de le résumer dans le texte comme hiragana. Cette fois, je ne l'ai pas traité parce que je pensais qu'il serait bon de le lire dans une certaine mesure

kakuryaku.PNG Les kanji en question

[^ dai1kai]: Faisons la voix lentement avec Python https://qiita.com/Mechanetai/items/78b04ed553cce01fa081

Recommended Posts

Faites-leur lire lentement l'Aozora Bunko: plus précisément
Demandez-leur de lire lentement la bibliothèque du ciel bleu
Faites-leur lire lentement l'Aozora Bunko: amélioration du code
Faisons résumer Aozora Bunko en discutant avec COTOHA