1+ ### A Transloadit Assembly that adds a translated TTS-voice (english to dutch) to an input video of hermit crabs.
2+
3+ '''
4+ Template 1:
5+
6+ {
7+ "steps": {
8+ "transcribe_json": {
9+ "use": ":original",
10+ "robot": "/speech/transcribe",
11+ "provider": "aws",
12+ "source_language": "${fields.language}",
13+ "format": "json",
14+ "result": true
15+ }
16+ }
17+ }
18+ '''
19+
20+ '''
21+ Template 2:
22+
23+ {
24+ "steps": {
25+ ":original": {
26+ "robot": "/upload/handle"
27+ },
28+ "import_video": {
29+ "robot": "/http/import",
30+ "url": "${fields.video}"
31+ },
32+ "translate": {
33+ "use": ":original",
34+ "robot": "/text/translate",
35+ "provider": "gcp",
36+ "target_language": "${fields.target_language}",
37+ "source_language": "${fields.source_language}",
38+ "result": true
39+ },
40+ "speech": {
41+ "use": "translate",
42+ "robot": "/text/speak",
43+ "provider": "gcp",
44+ "target_language": "${fields.target_language}",
45+ "voice": "female-1",
46+ "ssml": true,
47+ "result": true
48+ },
49+ "extract_audio": {
50+ "use": "import_video",
51+ "robot": "/video/encode",
52+ "result": true,
53+ "preset": "mp3",
54+ "ffmpeg": {
55+ "af": "${fields.ffmpeg}"
56+ },
57+ "ffmpeg_stack": "v3.3.3"
58+ },
59+ "merged_audio": {
60+ "robot": "/audio/merge",
61+ "preset": "mp3",
62+ "result": "true",
63+ "ffmpeg_stack": "v4.3.1",
64+ "use": {
65+ "steps": [
66+ {
67+ "name": "extract_audio",
68+ "as": "audio"
69+ },
70+ {
71+ "name": "speech",
72+ "as": "audio"
73+ }
74+ ],
75+ "volume": "sum",
76+ "bundle_steps": true
77+ }
78+ },
79+ "merged_video": {
80+ "robot": "/video/merge",
81+ "preset": "hls-720p",
82+ "ffmpeg_stack": "v4.3.1",
83+ "use": {
84+ "steps": [
85+ {
86+ "name": "merged_audio",
87+ "as": "audio"
88+ },
89+ {
90+ "name": "import_video",
91+ "as": "video"
92+ }
93+ ],
94+ "bundle_steps": true
95+ }
96+ }
97+ }
98+ }
99+ '''
100+
101+ from transloadit import client
102+ import urllib .request
103+ import json
104+
105+ tl = client .Transloadit ('TRANSLOADIT_KEY' , 'TRANSLOADIT_SECRET' )
106+
107+ source_language = 'en-GB'
108+ target_language = 'nl-NL'
109+
110+ def useTemplate (templateID , file_path = '' , result_name = '' , get_url = True , fields = '' ):
111+ assembly = tl .new_assembly ({'template_id' : templateID , 'fields' : fields })
112+
113+ if file_path != '' :
114+ assembly .add_file (open (file_path , 'rb' ))
115+
116+ assembly_response = assembly .create (retries = 5 , wait = True )
117+ if get_url :
118+ result_url = assembly_response .data .get ('results' ).get (result_name )[0 ].get ('ssl_url' )
119+ print (result_url )
120+ return result_url
121+ else :
122+ return assembly_response
123+
124+ response = useTemplate ('TEMPLATE_1_ID' , file_path = 'medium_crab.mp4' , get_url = False , fields = {"language" :source_language })
125+ transcription_result_url = response .data .get ('results' ).get ('transcribe_json' )[0 ].get ('ssl_url' )
126+ video_url = response .data .get ('uploads' )[0 ].get ('ssl_url' )
127+
128+ urllib .request .urlretrieve (transcription_result_url , 'transcribe_json' )
129+
130+ with open ('transcribe_json' ) as f :
131+ data = json .load (f )
132+
133+ ffmpeg = "volume=enable:volume=1"
134+
135+ startTimes = []
136+ endTimes = []
137+ sentences = []
138+ currentSentence = ''
139+
140+ startTimes .append (data ['words' ][0 ]['startTime' ])
141+
142+ for x in range (len (data ['words' ])):
143+ if (data ['words' ][x ]['text' ] == '.' ) and (x != len (data ['words' ]) - 1 ):
144+ time = data ['words' ][x + 1 ]['startTime' ]
145+ startTimes .append (time )
146+ if (data ['words' ][x ]['text' ] != '.' ):
147+ currentSentence = currentSentence + ' ' + data ['words' ][x ]['text' ]
148+ else :
149+ sentences .append (currentSentence + '.' )
150+ time = data ['words' ][x - 1 ]['endTime' ]
151+ endTimes .append (time )
152+ currentSentence = ''
153+
154+ print ('startTimes: ' + str (startTimes ))
155+ print ('endTimes: ' + str (startTimes ))
156+ print (sentences )
157+
158+ f = open ("words/text.txt" , "w" )
159+ f .write ("<speak><par>" )
160+
161+ for x in range (len (sentences )):
162+ f .write ('<media begin="{start}"><speak>{text}</speak></media>' .format (start = startTimes [x ], text = sentences [x ]))
163+ ffmpeg += ", volume=enable='between(t,{start},{end})':volume=0.2" .format (start = startTimes [x ], end = endTimes [x ])
164+
165+ f .write ("</par></speak>" )
166+ f .close ()
167+
168+ final_result_url = useTemplate ('TEMPLATE_2_ID' , file_path = 'words/text.txt' , result_name = 'merged_video' , get_url = True , fields = {"target_language" :target_language , "source_language" :source_language , "video" :video_url , "ffmpeg" :ffmpeg })
0 commit comments