159 lines
4.5 KiB
Python
159 lines
4.5 KiB
Python
|
import os
|
||
|
import srt
|
||
|
import sys
|
||
|
from google.cloud import speech
|
||
|
from google.cloud import storage
|
||
|
import moviepy.editor as mp
|
||
|
import time
|
||
|
import random
|
||
|
|
||
|
|
||
|
os.environ[
|
||
|
"GOOGLE_APPLICATION_CREDENTIALS"
|
||
|
] = "/home/user/mnf/project/MNF/conversion/subtitling/gifted-mountain-318504-0a5f94cda0c8.json"
|
||
|
|
||
|
basepath = "/home/user/mnf/project/MNF/conversion/subtitling"
|
||
|
|
||
|
|
||
|
# filename2 = sys.argv[1]
|
||
|
# movie_name = sys.argv[3]
|
||
|
|
||
|
# filename1 = os.path.splitext(filename2)[0]
|
||
|
|
||
|
# temp = basepath+"/"+filename2
|
||
|
|
||
|
# print(temp)
|
||
|
|
||
|
|
||
|
def google_sub(filename2, lang_code, vid_path):
|
||
|
|
||
|
# my_clip = mp.VideoFileClip(filename2) # uncomment when running from UI
|
||
|
# # my_clip = mp.VideoFileClip(temp) # comment when running from command prompt
|
||
|
|
||
|
# random_num = random.randint(0, 1000)
|
||
|
# temp = vid_path + "/audio_" + str(random_num) + ".wav"
|
||
|
# temp1 = "audio_" + str(random_num)+".wav"
|
||
|
# print(temp1)
|
||
|
# my_clip.audio.write_audiofile(temp)
|
||
|
wav_path = vid_path + "/" + filename2
|
||
|
|
||
|
# time.sleep(60)
|
||
|
client = storage.Client()
|
||
|
print("Success 1")
|
||
|
bucket = client.get_bucket("mnf_subtitle")
|
||
|
blob = bucket.blob(filename2)
|
||
|
|
||
|
storage.blob._DEFAULT_CHUNKSIZE = 2097152 # 1024 * 1024 B * 2 = 2 MB
|
||
|
storage.blob._MAX_MULTIPART_SIZE = 2097152 # 2 MB
|
||
|
|
||
|
with open(wav_path, "rb") as photo:
|
||
|
blob.upload_from_file(photo)
|
||
|
# time.sleep(60)
|
||
|
|
||
|
sample_rate_hertz = 44100
|
||
|
language_code = str(lang_code)
|
||
|
audio_channel_count = 2
|
||
|
encoding = "LINEAR16"
|
||
|
out_file = "g_subtitles"
|
||
|
max_chars = 40
|
||
|
# in place of course.wav we need to put bucket.blob('')
|
||
|
storage_uri = "gs://mnf_subtitle/" + filename2
|
||
|
print(storage_uri)
|
||
|
|
||
|
def long_running_recognize(uri):
|
||
|
|
||
|
client = speech.SpeechClient()
|
||
|
|
||
|
operation = client.long_running_recognize(
|
||
|
config={
|
||
|
"enable_word_time_offsets": True,
|
||
|
"enable_automatic_punctuation": True,
|
||
|
"sample_rate_hertz": sample_rate_hertz,
|
||
|
"language_code": language_code,
|
||
|
"audio_channel_count": audio_channel_count,
|
||
|
"encoding": encoding,
|
||
|
},
|
||
|
audio={"uri": storage_uri},
|
||
|
)
|
||
|
response = operation.result()
|
||
|
|
||
|
subs = []
|
||
|
|
||
|
for result in response.results:
|
||
|
|
||
|
subs = break_sentences(subs, result.alternatives[0])
|
||
|
|
||
|
print("Transcribing finished")
|
||
|
return subs
|
||
|
|
||
|
def del_blob(bucket_name, directory_name):
|
||
|
storage_client = storage.Client()
|
||
|
bucket = storage_client.get_bucket(bucket_name)
|
||
|
# list all objects in the directory
|
||
|
blobs = bucket.list_blobs(prefix=directory_name)
|
||
|
for blob in blobs:
|
||
|
blob.delete()
|
||
|
|
||
|
def break_sentences(subs, alternative):
|
||
|
firstword = True
|
||
|
charcount = 0
|
||
|
idx = len(subs) + 1
|
||
|
content = ""
|
||
|
|
||
|
for w in alternative.words:
|
||
|
if firstword:
|
||
|
|
||
|
start = w.start_time
|
||
|
|
||
|
charcount += len(w.word)
|
||
|
content += " " + w.word.strip()
|
||
|
|
||
|
if (
|
||
|
"." in w.word
|
||
|
or "!" in w.word
|
||
|
or "?" in w.word
|
||
|
or charcount > max_chars
|
||
|
or ("," in w.word and not firstword)
|
||
|
):
|
||
|
|
||
|
subs.append(
|
||
|
srt.Subtitle(
|
||
|
index=idx,
|
||
|
start=start,
|
||
|
# end=w.end_time.ToTimedelta(),
|
||
|
end=w.end_time,
|
||
|
content=srt.make_legal_content(content),
|
||
|
)
|
||
|
)
|
||
|
firstword = True
|
||
|
idx += 1
|
||
|
content = ""
|
||
|
charcount = 0
|
||
|
else:
|
||
|
firstword = False
|
||
|
return subs
|
||
|
|
||
|
def write_srt(subs):
|
||
|
srt_file = out_file + ".srt"
|
||
|
print("Writing {} subtitles to: {}".format(language_code, srt_file))
|
||
|
f = open(rf"{vid_path}/{srt_file}", "w", encoding="utf-8")
|
||
|
f.writelines(srt.compose(subs))
|
||
|
f.close()
|
||
|
return
|
||
|
|
||
|
def write_txt(subs):
|
||
|
txt_file = out_file + ".txt"
|
||
|
print("Writing text to: {}".format(txt_file))
|
||
|
f = open(txt_file, "w")
|
||
|
for s in subs:
|
||
|
f.write(s.content.strip() + "\n")
|
||
|
f.close()
|
||
|
return
|
||
|
|
||
|
subs = long_running_recognize(storage_uri)
|
||
|
|
||
|
print(subs)
|
||
|
|
||
|
write_srt(subs)
|
||
|
# del_blob("mnf_subtitle", filename2)
|