Generiere Power-Material für das Video "Ich habe versucht, mit XX zu singen" [python-pptx]

Überblick

Unter der Annahme, dass es als Material für das Video "Ich habe versucht, mit XX zu singen" verwendet wird, habe ich den Python-Code geschrieben, der die Originaltexte, die Parodietexte und das Bild generiert, wobei das entsprechende Bild an einer festen Stelle als PowerPoint-Folie platziert wird. スクリーンショット 2020-03-22 18.50.40.png

Hintergrund

Die Parodie-Songs, die gesungen werden, um die Originaltexte nur mit der Nomenklatur eines bestimmten Genres zu reproduzieren, werden als "Ich habe versucht, mit XX zu singen" -Serien bezeichnet. In dem Video "Ich habe versucht, mit XX zu singen" werden die Originaltexte, Parodietexte und die folgenden Bilder mit den entsprechenden Bildern an einem festen Ort häufig in einem Papierformat abgespielt. Wenn in den Parodietexten viele Nomenklaturen vorkommen, ist es schwierig, das entsprechende Videomaterial manuell zu erstellen, daher wollte ich es programmgesteuert automatisieren. Ich dachte auch, es wäre noch bequemer, wenn die Leute die vom Programm generierten Inhalte optimieren könnten, und entschied mich daher, sie als PowerPoint-Folie zu erstellen. Dafür habe ich eine Bibliothek namens python-pptx verwendet, die pptx-Dateien aus Python generieren kann.

Umgebung

macOS Catalina Version 10.15.3 python3.8.0 oder python3.7.0

Was vorzubereiten?

Bilddatei

Bereiten Sie ein Bild zum Einfügen in die Steckdose vor. Dieses Mal werde ich das Flag-Bild verwenden, das von [dieser Methode] erhalten wurde (https://qiita.com/shimajiroxyz/items/bebcdb06b47c6b399063).

Entsprechungstabelle mit Nomenklatur und Bilddateiname

Bereiten Sie eine CSV-Datei vor, in der die Nomenklatur-ID und der entsprechende Bilddateiname wie unten gezeigt durch Kommas getrennt eingegeben werden. Die Nomenklatur-ID wird in der später beschriebenen Textdefinitionsdatei verwendet.

img_file_names.csv


Island,Flag_of_Iceland.png
Irland,Flag_of_Ireland.png
Aserbaidschan,Flag_of_Azerbaijan.png
Afghanistan,Flag_of_Afghanistan.png
Abuhajia,Flag_of_the_Republic_of_Abkhazia.png
vereinigte Staaten von Amerika,Flag_of_the_United_States.png
Vereinigte Arabische Emirate,Flag_of_the_United_Arab_Emirates.png
Algerien,Flag_of_Algeria.png
...

Textdefinitionsdatei

Bereiten Sie die folgende CSV vor, in der die Originaltexte, die Parodietexte und die Nomenklatur-ID des anzuzeigenden Bildes einzeln in jeder durch Kommas getrennten Zeile eingegeben werden. Ich hatte das Gefühl, dass es schwierig ist, den Dateinamen für den Nasen-ID-Teil zu schreiben, und habe daher eine separate Tabelle erstellt, um die Nasen-ID durch den Dateinamen zu ersetzen. Wenn es Ihnen nichts ausmacht, den Namen der Bilddatei direkt zu schreiben, müssen Sie die Korrespondenztabelle nicht schreiben.

lyric.csv


Subaru im Wind,Kasachstan Tubal,Kasachstan
Subaru im Wind,Kasachstan Tubal,Tubal
Galaxie im Sand,Swasiland Guinea,Swasiland
Galaxie im Sand,Swasiland Guinea,Guinea
Wo sind alle hin,Indonesien Indien,Indonesien
Wo sind alle hin,Indonesien Indien,Indien
Ohne überwacht zu werden,Mari Monaco Resoto Monaco,Republik Mali
Ohne überwacht zu werden,Mari Monaco Resoto Monaco,Monaco
Ohne überwacht zu werden,Mari Monaco Resoto Monaco,Resoto
Ohne überwacht zu werden,Mari Monaco Resoto Monaco,Monaco
...

Dateiorganisation

Der Ordnername zum Speichern von Bilddateien lautet images, die Entsprechungstabelle zwischen Nomenklatur und Bilddateinamen lautet img_file_names.csv und die Textdefinitionsdatei lautet lyric.csv. Lassen Sie außerdem generate_pptx.py das Python-Skript sein, das powerpo generiert. Platzieren Sie diese Dateien wie unten gezeigt.

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

Code

In der obigen Dateistruktur werde ich das Python-Skript erläutern, das die PowerPoint-Datei ausgibt, die das Material des Videos "Ich habe versucht, mit XX zu singen" ist. Ich werde den ganzen Code am Ende setzen. Indem Sie diesen Code als Grundlage bearbeiten, können Sie Zeichen und Bilder hinzufügen, das Layout ändern usw. Siehe bei Bedarf auch die offizielle Python-Pptx-Dokumentation (https://python-pptx.readthedocs.io/en/latest/index.html).

Bibliotheksinstallation

Da python-pptx und Pillow verwendet werden, installieren Sie diese gegebenenfalls mit dem folgenden Befehl usw.

pip install python-pptx
pip install Pillow

verschiedene Konstanten importieren und einstellen

Importieren Sie die Bibliothek und legen Sie verschiedene Konstanten fest. Beachten Sie, dass die Foliengröße in englischer metrischer Einheit (WWU; 1 cm = 360.000 emu) angegeben ist. (Referenz: [Ich möchte die Foliengröße mit python-pptx ändern](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

#Foliengröße
#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"

#Die Höhe der oberen linken Koordinate des Textfelds für Parodietexte(Nicht erforderlich, da die linke und rechte Richtung zentriert sind)
IMG_FILE_PATH = "img_file_names.csv"#Eine CSV-Datei mit einer ID und einem Bildpfad pro Zeile
IMG_DIR = "./picture/"
LYRIC_FILE_PATH = "lyric.csv"#CSV-Datei mit Originaltexten, Parodietexten und Bilddatei-ID, die einzeln pro Zeile geschrieben werden

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) #Die Höhe des Bildes bei Anzeige auf einer Folie. Stellen Sie es vorerst auf 3 Zoll ein.
 IMG_CENTER_X, IMG_CENTER_Y = SLIDE_WIDTH / 2, SLIDE_HEIGHT / 2 # Mittelkoordinaten des Bildes `` `

##Informationen zur Konfigurationsdatei abrufen Weisen Sie die Informationen in der Korrespondenztabelle einer Variablen namens name2path (Diktattyp) und die Informationen in der Lyrics-Definitionsdatei einer Variablen namens Lyrics (Listentyp) zu.

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]

##Präsentationsobjekte generieren und skalieren Die Foliengröße ist Präsentation.slide_width、Presentation.slide_Sie kann geändert werden, indem der Höhe ein Wert zugewiesen wird.

# Objektdefinition schieben
prs = Presentation()
# Geben Sie die Foliengröße an
prs.slide_width = SLIDE_WIDTH
prs.slide_height = SLIDE_HEIGHT

##Fügen Sie Folien hinzu, die jedem Element des Textes für die Anweisung entsprechen Von hier aus erkläre ich den Vorgang des Hinzufügens von Folien, die jedem Element des Textes entsprechen, mit einer for-Anweisung. Erstens sind das 0., 1. und 2. Element der Lyrik die Originaltexte (Original)._Text), Parodietexte_Text), Bild-ID (Abb_Da es id) entspricht, holen Sie es sich. Wenn die Bild-ID nicht in der Korrespondenztabelle vorhanden ist, fahren Sie fort. Dateipfad (img), falls vorhanden_Datei) erfasst wird.

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] 

##Fügen Sie eine leere Folie hinzu Fügen Sie dem Präsentationsobjekt eine leere Folie hinzu_rutschen

 # Fügen Sie eine leere Folie hinzu
    blank_slide_layout = prs.slide_layouts[6]    
    slide = prs.slides.add_slide(blank_slide_layout) 

##Machen Sie den Hintergrund der Folie schwarz

 #Schwarzer Hintergrund
    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

Fügen Sie eine Textbox hinzu, die dieselbe Größe wie die Folie hat, und füllen Sie sie schwarz aus. ##Bild einfügen Bild IMG_CENTER_X, IMG_CENTER_Fügen Sie es in einer auf Y zentrierten Position ein. Ursprünglich Python-durch pptx hinzufügen_Im Bild kann nur die obere linke Koordinatenposition angegeben werden. Im Video "Ich habe versucht, mit XX zu singen" ist es jedoch besser, die Bildmitte vor und nach dem Umschalten des Bildes auszurichten. Fügen Sie sie daher nach dem separaten Erfassen der Bildgröße durch Zentrieren ein Machen. Die detaillierte Methode istpython-Bild mit pptx zentrierenBitte beziehen Sie sich darauf, wie es in zusammengefasst ist.

 # Bildgröße abrufen und Seitenverhältnis abrufen
    im = Image.open(img_file)
    im_width, im_height = im.size
    aspect_ratio = im_width/im_height

 #Berechnen Sie die Größe des angezeigten Bildes
    img_display_height = IMG_DISPLAY_HEIGHT
    img_display_width = aspect_ratio*img_display_height

 #Berechnen Sie beim Zentrieren die obere linke Koordinate des Bildes
    left = IMG_CENTER_X - img_display_width / 2
    top = IMG_CENTER_Y - img_display_height / 2

 # Bild zum Schieben hinzufügen
    slide.shapes.add_picture(img_file, left, top, height = IMG_DISPLAY_HEIGHT)

##Einfügen von Parodietexten Fügen Sie Parodietexte hinzu. Geben Sie an, dass die Breite des Textfelds der Folienbreite entspricht, und geben Sie dann PP an_ALIGN.Wenn Sie mit CENTER in Links-Rechts-Richtung zentrieren, werden die Texte in der Mitte angezeigt. Schriftfarbe und Schriftgröße sind Schriftarten.size、font.color.Geben Sie dies an, indem Sie rgb einen Wert zuweisen.

 # Textfeld hinzufügen
    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 
 agraph.alignment = PP_ALIGN.CENTER # Zentrierung in Links-Rechts-Richtung

##Fügen Sie den Originaltext ein Fügen Sie den Originaltext ein. Die Methode entspricht dem Einfügen der Parodietexte.

 # Textfeld hinzufügen
    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 

##Ausgabe Nach Abschluss der for-Anweisung Präsentation.Geben Sie die pptx-Datei mit save aus.

prs.save(OUTPUT_FILE_PATH)

#Ganzer Code Der gesamte Code ist unten.

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

# Foliengröße
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"

# Die Höhe der oberen linken Koordinate des Textfelds für Parodietexte (nicht erforderlich, da die linke und rechte Richtung zentriert sind).
 IMG_FILE_PATH = "img_file_names.csv" # CSV-Datei mit einer ID und einem Bildpfad pro Zeile
IMG_DIR = "./picture/"
 LYRIC_FILE_PATH = "lyric.csv" # Eine CSV-Datei, in der die Originaltexte, Parodietexte und die ID der Bilddatei einzeln pro Zeile geschrieben werden.

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 = Zoll (3) # Höhe des Bildes bei Anzeige auf der Folie. Stellen Sie es vorerst auf 3 Zoll ein.
 IMG_CENTER_X, IMG_CENTER_Y = SLIDE_WIDTH / 2, SLIDE_HEIGHT / 2 #Center-Koordinaten des Bildes

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]

# Objektdefinition schieben
prs = Presentation()
# Geben Sie die Foliengröße an
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] 

 # Fügen Sie eine leere Folie hinzu
    blank_slide_layout = prs.slide_layouts[6]    
    slide = prs.slides.add_slide(blank_slide_layout) 
    
 #Schwarzer Hintergrund
    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
    
 # Bildgröße abrufen und Seitenverhältnis abrufen
    im = Image.open(img_file)
    im_width, im_height = im.size
    aspect_ratio = im_width/im_height
    
 #Berechnen Sie die Größe des angezeigten Bildes
    img_display_height = IMG_DISPLAY_HEIGHT
    img_display_width = aspect_ratio*img_display_height
    
 #Berechnen Sie beim Zentrieren die obere linke Koordinate des Bildes
    left = IMG_CENTER_X - img_display_width / 2
    top = IMG_CENTER_Y - img_display_height / 2
    
 # Bild zum Schieben hinzufügen
    slide.shapes.add_picture(img_file, left, top, height = IMG_DISPLAY_HEIGHT)
      
 # Textfeld hinzufügen
    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 
    
 # Textfeld hinzufügen
    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)

#abschließend Wenn die pptx-Datei ausgegeben wird, können Sie sie als Material für die Videobearbeitungssoftware verwenden, indem Sie Feineinstellungen vornehmen und sie mit der Exportfunktion nach PNG usw. exportieren. Mit dem obigen Code wird eine einfache Folie erstellt. Versuchen Sie jedoch, den Text, die Position zum Einfügen von Bildern, die Textfarbe und die Hintergrundfarbe nach Ihren Wünschen zu ändern.

Recommended Posts

Generiere Power-Material für das Video "Ich habe versucht, mit XX zu singen" [python-pptx]
Ich habe versucht, ObjectId (Primärschlüssel) mit Pymongo zu generieren
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, Jojo mit LSTM ein seltsames Zitat zu machen
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht, mit Hy anzufangen
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, lightGBM, xg Boost mit Boruta zu verwenden
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe DCGAN implementiert und versucht, Äpfel zu generieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, mit OpenCV Bewegungen schnell zu erkennen
Ich habe versucht, Keras in TFv1.1 zu integrieren
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe versucht, LLVM IR mit Python auszugeben
Ich habe versucht, KI für Smash Bra zu machen
Ich habe versucht, ein Objekt mit M2Det zu erkennen!
Ich habe versucht, die Herstellung von Sushi mit Python zu automatisieren
Ich habe versucht, das Überleben der Titanic mit PyCaret vorherzusagen
Ich habe versucht, eine zufällige Zeichenfolge zu generieren
Ich habe versucht, Linux mit Discord Bot zu betreiben
Ich habe versucht, DP mit Fibonacci-Sequenz zu studieren
Ich habe versucht, Jupyter mit allen Amazon-Lichtern zu starten
Ich habe versucht, Tundele mit Naive Bays zu beurteilen
Ich habe versucht, mit Raspeye + Tact Switch eine Schaltfläche für Slack zu erstellen
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, maschinelles Lernen (Objekterkennung) mit TouchDesigner zu verschieben
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht, Faster R-CNN mit Pytorch auszuführen
Ich habe versucht, mit VOICEROID2 2 automatisch zu lesen und zu speichern
Ich habe versucht, DCGAN mit PyTorch zu implementieren und zu lernen
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
[Für Anfänger von Wettkampfprofis] Ich habe versucht, 40 AOJ "ITP I" -Fragen mit Python zu lösen
Ich habe versucht, mit VOICEROID2 automatisch zu lesen und zu speichern
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, automatisch die Zeichenfolge zu generieren, die mit Python in Mr. Adjustment eingegeben werden soll
Ich habe versucht, künstliches Perzeptron mit Python zu implementieren
Ich habe versucht, eine ML-Pipeline mit Cloud Composer zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
[Einführung in Pytorch] Ich habe versucht, Cifar10 mit VGG16 ♬ zu kategorisieren
[Python-pptx] Gibt PowerPoint-Schriftinformationen mit Python in CSV aus
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe einen einfachen RPA für die Anmeldung mit Selen ausprobiert
Ich habe versucht, Grad-CAM mit Keras und Tensorflow zu implementieren
Ich habe versucht, eine OCR-App mit PySimpleGUI zu erstellen
Ich habe versucht, SSD jetzt mit PyTorch zu implementieren (Dataset)
Ich habe versucht, Mask R-CNN mit Optical Flow zu interpolieren
Ich habe versucht, die Bayes'sche Optimierung zu durchlaufen. (Mit Beispielen)
Ich habe versucht, die alternative Klasse mit Tensorflow zu finden