Je publierai pour la première fois. Je m'appelle Denki Sheep de Golden Bridge. Mon activité principale est la traduction en chinois, mais j'aime aussi la programmation comme passe-temps.
J'ai expérimenté des langages, mais je suis toujours programmeur du dimanche. Je veux que les professionnels me frappent de plus en plus!
Récemment, en raison de l'influence de Corona, les interprètes sont particulièrement recherchés en ligne. Cela est souvent fait à l'avance dans le format d'enregistrement vidéo afin que la communication puisse devenir instable. En conséquence, non seulement la traduction mais aussi les ** sous-titres ** sont de plus en plus traités.
Jusqu'à présent, c'était une petite quantité, donc je devais le faire manuellement, mais comme c'était un gros problème, j'ai décidé de créer un fichier SRT pour économiser du travail.
Un format qui peut être considéré comme la norme de facto pour coller des sous-titres dans des vidéos. Le contenu est très simple.
1
00:00:01,050 --> 00:00:05,778
Premier sous-titre
2
00:00:07,850 --> 00:00:11,123
Sous-titre suivant
3
00:01:02,566 --> 00:01:12,456
Troisième sous-titre
comme, indice
Avec ce fichier, vous pouvez importer des sous-titres dans un fichier vidéo à la fois.
Nous utilisons AmiVoice Cloud Platform pour les brouillons de transcription japonais.
Comme il a été fabriqué au Japon, il est plus précis que Google, etc. en japonais.
Ecrire à partir de zéro est difficile, donc [Exemple de programme](https://acp.amivoice.com/main/manual/%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab Juste tweak% e3% 83% 97% e3% 83% ad% e3% 82% b0% e3% 83% a9% e3% 83% a0 /).
En exécutant cet exemple de programme, vous pouvez obtenir les données JSON à reconnaissance vocale. Pour plus d'informations
[JSON renvoyé (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 / # réponse)
Clé | Clé | Clé | La description |
---|---|---|---|
results | Disposition du "résultat de la reconnaissance de la section vocale" | ||
confidence | Degré de fiabilité(Une valeur comprise entre 0 et 1. 0:Faible fiabilité, 1:Grande fiabilité) | ||
starttime | Heure de début de la parole (les données vocales commencent par 0) | ||
endtime | Heure de fin de la conversation (les données vocales commencent par 0) | ||
tags | Inutilisé (tableau vide) | ||
rulename | Inutilisé (caractère vide) | ||
text | Texte du résultat de la reconnaissance | ||
tokens | Disposition des éléments morphologiques du texte du résultat de la reconnaissance | ||
written | Notation des éléments morphologiques (mots) | ||
confidence | Fiabilité morphologique (probabilité de résultat de reconnaissance) | ||
starttime | Heure de début de la morphologie (les données vocales commencent par 0) | ||
endtime | Heure de fin de la morphologie (les données vocales commencent par 0) | ||
spoken | Lecture de la morphologie | ||
utteranceid | ID des informations de résultat de reconnaissance*1 | ||
text | Le texte complet du résultat de la reconnaissance qui combine tous les "résultats de reconnaissance de la section vocale" | ||
code | Code à une lettre représentant le résultat*2 Liste des codes et messages contenus dans JSONvérification ... | ||
message | Chaîne de caractères représentant le contenu de l'erreur*2 Liste des codes et messages contenus dans JSONvérification ... |
À partir de ces données JSON, utilisez l'heure de début, l'heure de fin et les jetons écrits pour les organiser au format SRT.
Une fois que vous obtenez le JSON, nous commencerons la conversion immédiatement. Comme condition pour séparer les blocs de sous-titres
--Ponctuation (,?) --Time (millisecondes)
Je vais utiliser autour. De plus, je n'ajoute pas de signes de ponctuation aux sous-titres, je vais donc les ignorer.
Ces éléments sont des arguments de ligne de commande qui peuvent être modifiés de manière flexible.
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"]
#Définissez startTime si le sous-titre est vide
if sub == "":
#Même si le sous-titre est vide, ignorez si le contenu du jeton est un signe de ponctuation
if written in self.delimiters or written in self.skipWords:
continue
else:
startTime = token["starttime"]
#Créer des sauts de sous-titres
#Stockez les sous-titres dans des blocs dans chaque condition et réinitialisez une fois
#Si vous frappez un signe de ponctuation
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
#Connecter les sous-titres sauf conditions
else:
if written not in self.skipWords:
sub += token["written"]
#Pour boucle jusqu'ici
#Stocker le dernier bloc
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")
Vous avez réussi la conversion au format SRT.
Enfin, tout ce que vous avez à faire est d'ajuster ou de traduire le fichier SRT généré et de l'importer dans votre logiciel de montage vidéo. Avec Davinci Resolve, je viens de le déposer du pool de médias sur la piste vidéo.
D'après le travail manuel jusqu'à présent, il semble que l'on puisse s'attendre à une amélioration considérable de l'efficacité!
――Je souhaite me connecter à la traduction automatique!
Bonne chance pour créer des sous-titres pour la nouvelle ère normale!
Recommended Posts