Générer du matériel pour la vidéo "J'ai essayé de chanter avec XX" [python-pptx]

Aperçu

En supposant qu'il sera utilisé comme matériau pour la vidéo "J'ai essayé de chanter avec XX", j'ai écrit le code python qui génère les paroles originales, les paroles parodiques et l'image avec l'image correspondante placée à un endroit fixe sous forme de diapositive PowerPoint. スクリーンショット 2020-03-22 18.50.40.png

Contexte

Les chansons parodiques qui sont chantées pour reproduire les paroles originales avec seulement la nomenclature d'un genre spécifique sont appelées la série "J'ai essayé de chanter avec XX". Dans la vidéo «J'ai essayé de chanter avec XX», les paroles originales, les paroles parodiques et les images suivantes avec les images correspondantes placées à un endroit fixe sont souvent affichées dans un format de lecture papier. Quand il y a beaucoup de nomenclatures apparaissant dans les paroles de la parodie, il est difficile de créer manuellement le matériel vidéo correspondant, donc j'ai voulu l'automatiser par programmation. J'ai également pensé que ce serait encore plus pratique si les gens pouvaient affiner ce qui était généré par le programme, alors j'ai décidé de le faire sous forme de diapositive PowerPoint. Pour cela, j'ai utilisé une bibliothèque appelée python-pptx qui peut générer des fichiers pptx à partir de python.

environnement

macOS Catalina version 10.15.3 python3.8.0 ou python3.7.0

Quoi préparer

Fichier d'image

Préparez une image à insérer dans le Power Point. Cette fois, j'utiliserai l'image du drapeau obtenue à partir de cette méthode.

Table de correspondance de la nomenclature et du nom du fichier image

Préparez un fichier csv dans lequel l'ID de nomenclature et le nom de fichier image correspondant sont entrés séparés par des virgules comme indiqué ci-dessous. L'ID de nomenclature est utilisé dans le fichier de définition des paroles décrit plus loin.

img_file_names.csv


Islande,Flag_of_Iceland.png
Irlande,Flag_of_Ireland.png
Azerbaïdjan,Flag_of_Azerbaijan.png
Afghanistan,Flag_of_Afghanistan.png
Abuhajia,Flag_of_the_Republic_of_Abkhazia.png
les États-Unis d'Amérique,Flag_of_the_United_States.png
Emirats Arabes Unis,Flag_of_the_United_Arab_Emirates.png
Algérie,Flag_of_Algeria.png
...

Fichier de définition des paroles

Préparez le csv suivant dans lequel les paroles originales, les paroles parodiques et l'ID de nomenclature de l'image à afficher sont saisis un par un sur chaque ligne, séparés par des virgules. J'ai senti qu'il était difficile d'écrire le nom de fichier pour la partie ID du nez, j'ai donc créé un tableau séparé pour remplacer l'ID du nez par le nom du fichier. Si cela ne vous dérange pas d'écrire directement le nom du fichier image, vous n'avez pas besoin d'écrire la table de correspondance.

lyric.csv


Subaru dans le vent,Kazakhstan Tubal,Kazakhstan
Subaru dans le vent,Kazakhstan Tubal,Tubal
Galaxie dans le sable,Swaziland Guinée,Swaziland
Galaxie dans le sable,Swaziland Guinée,Guinée
Où est-ce que tout le monde est parti,Indonésie Inde,Indonésie
Où est-ce que tout le monde est parti,Indonésie Inde,Inde
Sans être surveillé,Mari Monaco Resoto Monaco,République du Mali
Sans être surveillé,Mari Monaco Resoto Monaco,Monaco
Sans être surveillé,Mari Monaco Resoto Monaco,Resoto
Sans être surveillé,Mari Monaco Resoto Monaco,Monaco
...

organisation des fichiers

Le nom du dossier pour stocker les fichiers image est pictures, la table de correspondance entre la nomenclature et les noms de fichier image est img_file_names.csv, et le fichier de définition des paroles est lyric.csv. Aussi, laissez generate_pptx.py être le script python qui génère powerpo. Placez ces fichiers comme indiqué ci-dessous.

.
├── generate_pptx.py
├── pitcures
│   ├── Flag_of_Afghanistan.png
│   ├── Flag_of_Albania.png
│   └── ...
├── img_file_names.csv
├── lyric.csv

code

Dans la structure de fichier ci-dessus, je vais expliquer le script python qui génère le fichier power point qui est le matériau de la vidéo "J'ai essayé de chanter avec XX". Je vais mettre tout le code à la fin. En éditant ce code comme base, vous pouvez ajouter des caractères et des images, modifier la mise en page, etc. Consultez également la documentation officielle python-pptx (https://python-pptx.readthedocs.io/en/latest/index.html) si nécessaire.

Installation de la bibliothèque

Puisque python-pptx et Pillow sont utilisés, veuillez installer avec la commande suivante, etc. si nécessaire.

pip install python-pptx
pip install Pillow

importer et définir diverses constantes

Importez la bibliothèque et définissez diverses constantes. Notez que la taille de la diapositive est en unité métrique anglaise (EMU; 1 cm = 360 000 emu). (Référence: [Je souhaite modifier la taille de la diapositive avec python-pptx](https://ja.stackoverflow.com/questions/37638/python-pptx%E3%81%A7%E3%82%B9%E3%83%] A9% E3% 82% A4% E3% 83% 89% E3% 81% AE% E3% 82% B5% E3% 82% A4% E3% 82% BA% E3% 82% 92% E5% A4% 89% E3% 81% 88% E3% 81% 9F% E3% 81% 84))

from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from PIL import Image
from pptx.dml.color import RGBColor

#Taille de la diapositive
#4:3 (default) 9144000x6858000
#16:9 12193200x6858000
SLIDE_WIDTH = 12193200
SLIDE_HEIGHT = 6858000
BACKGROUD_RGB = RGBColor(0,0,0)
FONT_RGB = RGBColor(255,255,255)

OUTPUT_FILE_PATH = "test.pptx"

#La hauteur de la coordonnée supérieure gauche de la zone de texte des paroles de la parodie(Non requis car les directions gauche et droite sont centrées)
IMG_FILE_PATH = "img_file_names.csv"#Un fichier csv avec un identifiant et un chemin d'image par ligne
IMG_DIR = "./picture/"
LYRIC_FILE_PATH = "lyric.csv"#Fichier CSV avec paroles originales, paroles de parodie et ID de fichier image écrits un par un par ligne

PARODY_LYRIC_HEIGHT = Inches(5.5)
PARODY_LYRIC_FONTSIZE = Pt(36)

ORIGINAL_LYRIC_HEIGHT = Inches(6.5)
ORIGINAL_LYRIC_FONTSIZE = Pt(28)

IMG_DISPLAY_HEIGHT = Inches(3) #La hauteur de l'image lorsqu'elle est affichée sur une diapositive. Pour le moment, réglez-le sur 3 pouces.
 IMG_CENTER_X, IMG_CENTER_Y = SLIDE_WIDTH / 2, SLIDE_HEIGHT / 2 # Coordonnées du centre de l'image `` `

##Obtenir des informations sur le fichier de configuration Affectez les informations de la table de correspondance à une variable appelée name2path (type dict) et les informations du fichier de définition des paroles à une variable appelée lyrics (type liste).

name2path = {}
with open(IMG_FILE_PATH,"r") as f:
    text = [v.split(',') for v in f.read().split("\n")]
    for v in text:
        if len(v) == 2:
            name2path[v[0]]=IMG_DIR+v[1]
lyrics=[]
with open(LYRIC_FILE_PATH,"r") as f:
    lyrics = [v.split(',') for v in f.read().split("\n") if len(v.split(','))==3]

##Générer et dimensionner des objets de présentation La taille de la diapositive est la présentation.slide_width、Presentation.slide_Il peut être modifié en attribuant une valeur à la hauteur.

# Définition d'objet de diapositive
prs = Presentation()
# Spécifiez la taille de la diapositive
prs.slide_width = SLIDE_WIDTH
prs.slide_height = SLIDE_HEIGHT

##Ajouter des diapositives correspondant à chaque élément des paroles dans une déclaration De là, je vais expliquer le processus d'ajout de diapositives correspondant à chaque élément des paroles avec une déclaration for. Premièrement, les 0e, 1er et 2e éléments des paroles sont les paroles originales (originales)._texte), paroles de parodie_text), identifiant de l'image (img_Puisqu'il correspond à id), récupérez-le. Si l'ID d'image n'existe pas dans la table de correspondance, continuez. Chemin du fichier (img) s'il existe_fichier) est acquis.

for index,lyric in enumerate(lyrics):
    original_text = lyric[0]
    parody_text = lyric[1]
    img_id = lyric[2]
    if img_id not in name2path:
        print("img_id",img_id,"does not exist") 
        print("line",index,":",lyric,"is ignored") 
        continue 
    img_file = name2path[img_id] 

##Ajouter une diapositive vierge Ajouter une diapositive vierge à l'objet Présentation_faire glisser

 #Ajouter une diapositive vierge
    blank_slide_layout = prs.slide_layouts[6]    
    slide = prs.slides.add_slide(blank_slide_layout) 

##Rendre l'arrière-plan de la diapositive noir

 #Fond noir
    shapes = slide.shapes
    left, top, width, height = 0, 0, SLIDE_WIDTH, SLIDE_HEIGHT
    shape = shapes.add_textbox(left,top,width,height)
    fill = shape.fill
    fill.solid()
    fill.fore_color.rgb = BACKGROUD_RGB

Ajoutez une zone de texte de la même taille que la diapositive et remplissez-la en noir. ##Insérer une image Image IMG_CENTER_X, IMG_CENTER_Insérez-le dans une position centrée sur Y. À l'origine, python-ajouter par pptx_Sur l'image, seule la position des coordonnées en haut à gauche peut être spécifiée, mais dans la vidéo "J'ai essayé de chanter avec XX", il est préférable que le centre de l'image soit aligné avant et après le changement de l'image, donc après avoir acquis la taille de l'image séparément, insérez-la en centrant Faire. La méthode détaillée estpython-Centrer l'image avec pptxVeuillez vous y référer tel qu'il est résumé dans.

 # Obtenir la taille de l'image et obtenir le rapport hauteur / largeur
    im = Image.open(img_file)
    im_width, im_height = im.size
    aspect_ratio = im_width/im_height

 #Calculer la taille de l'image affichée
    img_display_height = IMG_DISPLAY_HEIGHT
    img_display_width = aspect_ratio*img_display_height

 #Calculer les coordonnées en haut à gauche de l'image lors du centrage
    left = IMG_CENTER_X - img_display_width / 2
    top = IMG_CENTER_Y - img_display_height / 2

 #Ajouter une image à la diapositive
    slide.shapes.add_picture(img_file, left, top, height = IMG_DISPLAY_HEIGHT)

##Insertion de paroles parodiques Ajoutez des paroles de parodie. Spécifiez la largeur de la zone de texte pour qu'elle soit identique à la largeur de la diapositive, puis PP_ALIGN.En centrant dans la direction gauche-droite avec CENTRE, les paroles seront affichées au centre. La couleur et la taille de la police sont des polices.size、font.color.Spécifiez en attribuant une valeur à rgb.

 #Ajouter une zone de texte
    left, top, width, height = 0, PARODY_LYRIC_HEIGHT, SLIDE_WIDTH, Inches(1) 
    txBox = slide.shapes.add_textbox(left, top, width, height) 
    tf = txBox.text_frame 
    tf.text = parody_text
    paragraph = tf.paragraphs[0]
    font = paragraph.font 
    font.size = PARODY_LYRIC_FONTSIZE
    font.color.rgb = FONT_RGB 
 paragraphe.alignment = PP_ALIGN.CENTER # Centrage dans le sens gauche-droite

##Insertion des paroles originales Insérez les paroles originales. La méthode est la même que pour l'insertion des paroles parodiques.

 #Ajouter une zone de texte
    left, top, width, height = 0, ORIGINAL_LYRIC_HEIGHT, SLIDE_WIDTH, Inches(1) 
    txBox = slide.shapes.add_textbox(left, top, width, height) 
    tf = txBox.text_frame 
    tf.text = original_text
    paragraph = tf.paragraphs[0]
    font = paragraph.font 
    font.size = ORIGINAL_LYRIC_FONTSIZE 
    font.color.rgb = FONT_RGB
    paragraph.alignment = PP_ALIGN.CENTER 

##production Après avoir terminé la déclaration for, Présentation.Sortez le fichier pptx avec save.

prs.save(OUTPUT_FILE_PATH)

#Code entier Le code complet est ci-dessous.

generate_pptx.py



from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.enum.text import PP_ALIGN
from PIL import Image
from pptx.dml.color import RGBColor

# Taille de la diapositive
4:3 (default) 9144000x6858000
16:9 12193200x6858000
SLIDE_WIDTH = 12193200
SLIDE_HEIGHT = 6858000
BACKGROUD_RGB = RGBColor(0,0,0)
FONT_RGB = RGBColor(255,255,255)

OUTPUT_FILE_PATH = "test.pptx"

# La hauteur de la coordonnée supérieure gauche de la zone de texte des paroles de la parodie (pas nécessaire car les directions gauche et droite sont centrées)
 IMG_FILE_PATH = "img_file_names.csv" # fichier csv avec un identifiant et un chemin d'image par ligne
IMG_DIR = "./picture/"
 LYRIC_FILE_PATH = "lyric.csv" # Un fichier csv dans lequel les paroles originales, les paroles de la parodie et l'ID du fichier image sont écrits un par un par ligne.

PARODY_LYRIC_HEIGHT = Inches(5.5)
PARODY_LYRIC_FONTSIZE = Pt(36)

ORIGINAL_LYRIC_HEIGHT = Inches(6.5)
ORIGINAL_LYRIC_FONTSIZE = Pt(28)

 IMG_DISPLAY_HEIGHT = Inches (3) # Hauteur de l'image lorsqu'elle est affichée sur la diapositive. Pour le moment, réglez-le sur 3 pouces.
 IMG_CENTER_X, IMG_CENTER_Y = SLIDE_WIDTH / 2, SLIDE_HEIGHT / 2 # Coordonnées du centre de l'image

name2path = {}
with open(IMG_FILE_PATH,"r") as f:
    text = [v.split(',') for v in f.read().split("\n")]
    for v in text:
        if len(v) == 2:
            name2path[v[0]]=IMG_DIR+v[1]
lyrics=[]
with open(LYRIC_FILE_PATH,"r") as f:
    lyrics = [v.split(',') for v in f.read().split("\n") if len(v.split(','))==3]

# Définition d'objet de diapositive
prs = Presentation()
# Spécifiez la taille de la diapositive
prs.slide_width = SLIDE_WIDTH
prs.slide_height = SLIDE_HEIGHT

for index,lyric in enumerate(lyrics):
    original_text = lyric[0]
    parody_text = lyric[1]
    img_id = lyric[2]
    if img_id not in name2path:
        print("img_id",img_id,"does not exist") 
        print("line",index,":",lyric,"is ignored") 
        continue 
    img_file = name2path[img_id] 

 #Ajouter une diapositive vierge
    blank_slide_layout = prs.slide_layouts[6]    
    slide = prs.slides.add_slide(blank_slide_layout) 
    
 #Fond noir
    shapes = slide.shapes
    left, top, width, height = 0, 0, SLIDE_WIDTH, SLIDE_HEIGHT
    shape = shapes.add_textbox(left,top,width,height)
    fill = shape.fill
    fill.solid()
    fill.fore_color.rgb = BACKGROUD_RGB
    
 # Obtenir la taille de l'image et obtenir le rapport hauteur / largeur
    im = Image.open(img_file)
    im_width, im_height = im.size
    aspect_ratio = im_width/im_height
    
 #Calculer la taille de l'image affichée
    img_display_height = IMG_DISPLAY_HEIGHT
    img_display_width = aspect_ratio*img_display_height
    
 #Calculer les coordonnées en haut à gauche de l'image lors du centrage
    left = IMG_CENTER_X - img_display_width / 2
    top = IMG_CENTER_Y - img_display_height / 2
    
 #Ajouter une image à la diapositive
    slide.shapes.add_picture(img_file, left, top, height = IMG_DISPLAY_HEIGHT)
      
 #Ajouter une zone de texte
    left, top, width, height = 0, PARODY_LYRIC_HEIGHT, SLIDE_WIDTH, Inches(1) 
    txBox = slide.shapes.add_textbox(left, top, width, height) 
    tf = txBox.text_frame 
    tf.text = parody_text
    paragraph = tf.paragraphs[0]
    font = paragraph.font 
    font.size = PARODY_LYRIC_FONTSIZE
    font.color.rgb = FONT_RGB 
    paragraph.alignment = PP_ALIGN.CENTER 
    
 #Ajouter une zone de texte
    left, top, width, height = 0, ORIGINAL_LYRIC_HEIGHT, SLIDE_WIDTH, Inches(1) 
    txBox = slide.shapes.add_textbox(left, top, width, height) 
    tf = txBox.text_frame 
    tf.text = original_text
    paragraph = tf.paragraphs[0]
    font = paragraph.font 
    font.size = ORIGINAL_LYRIC_FONTSIZE 
    font.color.rgb = FONT_RGB
    paragraph.alignment = PP_ALIGN.CENTER 

prs.save(OUTPUT_FILE_PATH)

#en conclusion Lorsque le fichier pptx est sorti, vous pouvez l'utiliser comme matériau pour un logiciel de montage vidéo en effectuant des ajustements précis et en l'exportant au format png, etc. avec la fonction d'exportation. Le code ci-dessus créera une simple diapositive, mais essayez de changer les paroles, la position d'insertion de l'image, la couleur du texte et la couleur d'arrière-plan à votre guise.

Recommended Posts

Générer du matériel pour la vidéo "J'ai essayé de chanter avec XX" [python-pptx]
J'ai essayé de générer ObjectId (clé primaire) avec pymongo
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé de faire une étrange citation pour Jojo avec LSTM
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de commencer avec Hy
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé d'utiliser lightGBM, xg boost avec Boruta
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai implémenté DCGAN et essayé de générer des pommes
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de détecter rapidement un mouvement avec OpenCV
J'ai essayé d'intégrer Keras dans TFv1.1
J'ai essayé d'obtenir des données CloudWatch avec Python
J'ai essayé de sortir LLVM IR avec Python
J'ai essayé de faire de l'IA pour Smash Bra
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python
J'ai essayé de prédire la survie du Titanic avec PyCaret
J'ai essayé de générer une chaîne de caractères aléatoire
J'ai essayé d'utiliser Linux avec Discord Bot
J'ai essayé d'étudier DP avec séquence de Fibonacci
J'ai essayé de démarrer Jupyter avec toutes les lumières d'Amazon
J'ai essayé de juger Tundele avec Naive Bays
J'ai essayé de créer un bouton pour Slack avec Raspeye + Tact Switch
J'ai essayé d'entraîner la fonction péché avec chainer
J'ai essayé de déplacer l'apprentissage automatique (détection d'objet) avec TouchDesigner
J'ai essayé d'extraire des fonctionnalités avec SIFT d'OpenCV
J'ai essayé de déplacer Faster R-CNN rapidement avec pytorch
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2 2
J'ai essayé d'implémenter et d'apprendre DCGAN avec PyTorch
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
[Pour les professionnels de la compétition débutants] J'ai essayé de résoudre 40 questions AOJ "ITP I" avec python
J'ai essayé de lire et d'enregistrer automatiquement avec VOICEROID2
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé de générer automatiquement la chaîne de caractères à entrer dans M. Adjustment avec Python
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de créer un pipeline ML avec Cloud Composer
J'ai essayé de créer un environnement d'apprentissage amélioré pour Othello avec Open AI gym
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬
[Python-pptx] Afficher les informations de police PowerPoint au format csv avec python
J'ai essayé de résoudre le problème avec Python Vol.1
J'ai essayé un RPA simple pour me connecter avec du sélénium
J'ai essayé d'implémenter Grad-CAM avec keras et tensorflow
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé d'implémenter SSD avec PyTorch maintenant (Dataset)
J'ai essayé d'interpoler le masque R-CNN avec un flux optique
J'ai essayé de passer par l'optimisation bayésienne. (Avec des exemples)
J'ai essayé de trouver la classe alternative avec tensorflow