[PYTHON] Ich habe eine Untertiteldatei (SRT) aus JSON-Daten von AmiVoice erstellt

Einführung

Ich werde zum ersten Mal posten. Mein Name ist Denki Sheep von der Golden Bridge. Mein Hauptgeschäft ist die chinesische Übersetzung, aber ich programmiere auch gerne als Hobby.

Ich habe mit Sprachen experimentiert, bin aber immer noch ein Sonntagsprogrammierer. Ich möchte, dass Profis mich immer mehr schlagen!

Hintergrund

In letzter Zeit sind Dolmetscher aufgrund des Einflusses von Corona online besonders gefragt. In vielen Fällen wird das Videoaufzeichnungsformat im Voraus verwendet, so dass die Kommunikation instabil werden kann. Infolgedessen wurden nicht nur Übersetzungen, sondern auch ** Untertitel ** immer mehr behandelt.

Bis jetzt war es eine kleine Menge, also musste ich es manuell machen, aber da es eine große Sache war, entschied ich mich, eine SRT-Datei zu erstellen, um Arbeit zu sparen.

Informationen zu SRT-Dateien

Ein Format, das als De-facto-Standard zum Einfügen von Untertiteln in Videos bezeichnet werden kann. Der Inhalt ist sehr einfach.

1
00:00:01,050 --> 00:00:05,778
Erster Untertitel

2
00:00:07,850 --> 00:00:11,123
Nächster Untertitel

3
00:01:02,566 --> 00:01:12,456
Dritter Untertitel

mögen, Index

Mit dieser Datei können Sie Untertitel sofort in eine Videodatei importieren.

Transkription

Wir verwenden AmiVoice Cloud Platform für japanische Transkriptionsentwürfe.

Da es in Japan hergestellt wurde, ist es auf Japanisch genauer als Google usw.

Das Schreiben von Grund auf ist schwierig, daher [Beispielprogramm](https://acp.amivoice.com/main/manual/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab Nur% e3% 83% 97% e3% 83% ad% e3% 82% b0% e3% 83% a9% e3% 83% a0 /) optimieren.

Durch Ausführen dieses Beispielprogramms können Sie die spracherkannten JSON-Daten abrufen. Für mehr Informationen

[Zurückgegebenes JSON (AmiVoice)](https://acp.amivoice.com/main/manual/if%E4%BB%95%E6%A7%98-http%E9%9F%B3%E5%A3 % B0% E8% AA% 8D% E8% AD% 98api% E8% A9% B3% E7% B4% B0 / # Antwort)

Schlüssel Schlüssel Schlüssel Erläuterung
results Anordnung von "Erkennungsergebnis des Sprachabschnitts"
confidence Grad der Zuverlässigkeit(Ein Wert zwischen 0 und 1. 0:Geringe Zuverlässigkeit, 1:Hohe Zuverlässigkeit)
starttime Sprechstartzeit (Sprachdaten beginnen mit 0)
endtime Sprechendzeit (Sprachdaten beginnen mit 0)
tags Nicht verwendet (leeres Array)
rulename Unbenutzt (leeres Zeichen)
text Text des Erkennungsergebnisses
tokens Anordnung der morphologischen Elemente des Erkennungsergebnistextes
written Notation morphologischer Elemente (Wörter)
confidence Morphologische Zuverlässigkeit (Wahrscheinlichkeit des Erkennungsergebnisses)
starttime Startzeit der Morphologie (Sprachdaten beginnen mit 0)
endtime Endzeit der Morphologie (Sprachdaten beginnen mit 0)
spoken Lesen der Morphologie
utteranceid ID der Erkennungsergebnisinformationen*1
text Der gesamte Erkennungsergebnistext, der alle "Erkennungsergebnisse des Sprachabschnitts" kombiniert.
code Ein-Buchstaben-Code für das Ergebnis*2 Liste der in JSON enthaltenen Codes und NachrichtenÜberprüfung ...
message Zeichenfolge, die den Fehlerinhalt darstellt*2 Liste der in JSON enthaltenen Codes und NachrichtenÜberprüfung ...

Verwenden Sie aus diesen JSON-Daten Startzeit, Endzeit und in Token geschrieben, um sie im SRT-Format anzuordnen.

Lesen Sie JSON

Sobald Sie den JSON erhalten haben, werden wir sofort mit der Konvertierung beginnen. Als Bedingung zum Trennen von Untertitelblöcken

Ich werde herum verwenden. Außerdem füge ich den Untertiteln keine Satzzeichen hinzu, daher überspringe ich sie.

Diese Elemente sind Befehlszeilenargumente, die flexibel geändert werden können.

import argparse
import json

parser = argparse.ArgumentParser()
parser.add_argument("file", help="Designate JSON file name to read")
parser.add_argument("-d", "--delimiters", help="Designate delimiters to separate subtitles. Default value is ['。','、']", default="。,、")
parser.add_argument("-s", "--skip", help="Designate skip words which do not inculud in subtitles. Default value is ['。','、']", default="。,、")
parser.add_argument("-t", "--time", help="Designate allowed time for single subtile by millisecongds. Default value is 5000", default=5000, type=int)
parser.add_argument("-c", "--charas", help="Designate allowed charas for single subtile. Default value is 25", default=25, type=int)

class SRTFomart():
	def __init__(self, args): 
		self.text = ""
		self.blocks = []
		self.delimiters = args.delimiters.split(",")
		self.skipWords = args.skip.split(",")
		self.time = args.time
		self.charas = args.charas

	def readFile(self, file):
		f = open(file, "r", encoding="utf-8")
		contents = f.read()
		f.close()
		data = json.loads(contents)["results"][0]
		self.text = data["text"]
		self.readTokens(data["tokens"])

	def readTokens(self, tokens):
		sub = ""
		startTime = 0
		index = 1
		# subTitles = []
		
		for token in tokens:
			written = token["written"]
			#Stellen Sie startTime ein, wenn der Untertitel leer ist
			if sub == "":
				#Auch wenn die Untertitel leer sind, überspringen Sie, wenn der Inhalt des Tokens Satzzeichen usw. sind.
				if written in self.delimiters or written in self.skipWords:
					continue

				else:
					startTime = token["starttime"]

			#Erstellen Sie Untertitelumbrüche
			#Speichern Sie Untertitel unter jeder Bedingung in Blöcken und setzen Sie sie einmal zurück
			#Wenn Sie ein Interpunktionszeichen treffen
			if written in self.delimiters or len(sub) > self.charas or token["endtime"] - startTime > self.time:
				self.blocks.append(self.createSRTBlock(index, startTime, token["endtime"], sub))
				sub = ""
				startTime = 0
				index += 1

			#Verbinden Sie Untertitel mit Ausnahme der Bedingungen
			else:
				if written not in self.skipWords:
					sub += token["written"]
		
		#Für Schleife bisher
		#Speichern Sie den letzten Block
		self.blocks.append(self.createSRTBlock(index, startTime, tokens[-1]["endtime"], sub))


	def createSRTBlock(self, index, startTime, endTime, sub):
		stime = self.timeFormat(startTime)
		etime = self.timeFormat(endTime)
		return f"{index}\n{stime} --> {etime}\n{sub}\n"

	def timeFormat(self, time):
		time_ = time
		ms_ = int(time_ % 1000)
		time_ = int((time_ - ms_) / 1000)
		sec_ = int(time_ % 60)
		time_ = int((time_ - sec_) / 60)
		mn_ = int(time_ % 60)
		time_ = int((time_ - mn_) /60)
		hr_ = int(time_ % 60)
		if ms_ < 10:
			ms = f"00{ms_}"
		elif ms_ < 100:
			ms = f"0{ms_}"
		else:
			ms = str(ms_)
				
		if sec_ < 10:
			sec = f"0{sec_}"
		else:
			sec = str(sec_)
				
		if mn_ < 10:
			mn = f"0{mn_}"
		else:
			mn = str(mn_)
				
		if hr_ < 10:
			hr = f"0{hr_}"
		else:
			hr = str(hr_)
	
		return f"{hr}:{mn}:{sec},{ms}"

	def exportSRTText(self):
		return "\n".join(self.blocks)


if __name__ == "__main__":
	args = parser.parse_args()
	if not args.file.endswith(".json"):
		print("Please set json file")
	
	else:
		srt = SRTFomart(args)
		srt.readFile(args.file)
		text = srt.exportSRTText()
		srtName = args.file.replace(".json", ".srt")
		f = open(srtName, "w", encoding="utf-8")
		f.write(text)
		f.close()
		print("done")


Sie haben erfolgreich in das SRT-Format konvertiert.

importieren

Schließlich müssen Sie nur die generierte SRT-Datei anpassen oder übersetzen und in Ihre Videobearbeitungssoftware importieren. Mit Davinci Resolve habe ich es einfach aus dem Medienpool auf die Videospur gelegt.

Von der bisherigen manuellen Arbeit scheinen wir eine erhebliche Effizienzverbesserung erwarten zu können!

von jetzt an

――Ich möchte mich mit maschineller Übersetzung verbinden!

Viel Glück beim Erstellen von Untertiteln für die neue normale Ära!

Recommended Posts

Ich habe eine Untertiteldatei (SRT) aus JSON-Daten von AmiVoice erstellt
Ich habe ein Tool zum Generieren von Markdown aus der exportierten Scrapbox-JSON-Datei erstellt
Ich habe versucht, Daten aus einer Datei mit Node.js zu lesen.
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe ein Programm erstellt, um die Größe einer Datei mit Python zu überprüfen
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe ein Paket erstellt, um eine ausführbare Datei aus dem Hy-Quellcode zu erstellen
〇✕ Ich habe ein Spiel gemacht
Erstellen Sie eine Kopie einer Google Drive-Datei aus Python
Python - Lesen Sie Daten aus einer numerischen Datendatei und berechnen Sie die Kovarianz
Ich habe ein Schwellenwertänderungsfeld für Peppers Dialog erstellt
Ich habe versucht, Python aus einer Bat-Datei auszuführen
Ich habe versucht, mit Scrapy Daten von einer Website zu sammeln
Python-Skript, das eine JSON-Datei aus einer CSV-Datei erstellt
Ich habe ein Tool zur Erzeugung sich wiederholender Textdaten "rpttxt" erstellt.
Ich habe ein Skript in Python erstellt, um eine Textdatei für JSON zu konvertieren (für das vscode-Benutzer-Snippet).
Ich möchte viele Prozesse von Python aus starten
Ich habe ein Tool erstellt, um eine Wortwolke aus Wikipedia zu erstellen
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 1)
Python> Aus einer mehrzeiligen Zeichenfolge anstelle einer Datei lesen> io.StringIO ()
Ich habe ein Punktbild des Bildes von Irasutoya gemacht. (Teil 2)
Ich habe Sie dazu gebracht, Befehle über einen WEB-Browser auszuführen
Erstellen Sie eine Dummy-Datendatei
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe einen Linienbot erstellt, der das Geschlecht und das Alter einer Person anhand des Bildes errät
Welche Fähigkeiten sollte ich als Datenanalyst von unerfahrenen studieren?
Python> Ich habe einen Testcode für meine eigene externe Datei erstellt
Ich habe viele Dateien für die RDP-Verbindung mit Python erstellt
Impressionen von Touch, einem von Python erstellten Datenvisualisierungstool
Ich habe einen schlaffen Bot gemacht, der mich über die Temperatur informiert
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
[Kaggle] Ich habe mit dem Titanic-Tutorial eine Sammlung von Problemen erstellt
Ich habe eine C ++ - Lernseite erstellt
Kann ich Datenwissenschaftler werden?
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich habe einen Wikipedia Gacha Bot gemacht
Extrahieren Sie bestimmte Daten aus komplexem JSON
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Ich habe mit Python einen Daemon erstellt
Ich habe ein Plugin erstellt, um mit Vim eine Markdown-Tabelle aus CSV zu generieren
[Ver1.3.1 Update] Ich habe DataLiner erstellt, eine Datenvorverarbeitungsbibliothek für maschinelles Lernen.
Ich habe mir das Google-Labor notiert, das Spleeter problemlos verwenden kann.
Ich habe eine Art einfaches Bildverarbeitungswerkzeug in der Sprache Go erstellt.
Eine Geschichte von einer Person, die von Anfang an auf Datenwissenschaftler abzielte
Ich habe einen einfachen Timer erstellt, der vom Terminal aus gestartet werden kann
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Ich habe versucht, eine Clusteranalyse von Kunden anhand von Kaufdaten durchzuführen
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe ein WebAPI gemacht! Erstellen einer Umgebung aus Django Rest Framework 1 mit EC2
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Ich habe ein Skript erstellt, um zu überprüfen, ob an der angegebenen Position der JSON-Datei in Python Englisch eingegeben wird.
Ich habe in Python ein Programm erstellt, das FX-CSV-Daten liest und eine große Anzahl von Diagrammbildern erstellt