1 package com.neuronrobotics.bowlerstudio.lipsync;
3 import java.io.BufferedInputStream;
5 import java.io.FileOutputStream;
6 import java.io.FileWriter;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.StringWriter;
10 import java.lang.reflect.Type;
12 import java.nio.charset.StandardCharsets;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
17 import javax.sound.sampled.AudioFileFormat;
18 import javax.sound.sampled.AudioInputStream;
19 import javax.sound.sampled.AudioSystem;
20 import org.apache.commons.io.IOUtils;
22 import com.google.gson.Gson;
23 import com.google.gson.GsonBuilder;
24 import com.google.gson.reflect.TypeToken;
25 import com.neuronrobotics.bowlerstudio.AudioStatus;
26 import com.neuronrobotics.bowlerstudio.IAudioProcessingLambda;
27 import com.neuronrobotics.bowlerstudio.scripting.ScriptingEngine;
28 import com.neuronrobotics.video.OSUtil;
30 import net.lingala.zip4j.ZipFile;
31 import net.lingala.zip4j.exception.ZipException;
34 ArrayList<TimeCodedViseme> timeCodedVisemes =
null;
37 public void processRaw(File f, String ttsLocation)
throws Exception {
38 String os = OSUtil.isLinux() ?
"Linux" : OSUtil.isOSX() ?
"macOS" :
"Windows";
39 String exeExtention = OSUtil.isWindows() ?
".exe" :
"";
42 timeCodedVisemes =
new ArrayList<>();
44 System.out.println(
"Downloading " + exe.getAbsolutePath());
45 String zipfileName =
"Rhubarb-Lip-Sync-" +
RhubarbVersion +
"-" + os +
".zip";
46 String urlStr =
"https://github.com/DanielSWolf/rhubarb-lip-sync/releases/download/v" +
RhubarbVersion +
"/"
49 if (!zipfile.exists()) {
50 URL url =
new URL(urlStr);
51 BufferedInputStream bis =
new BufferedInputStream(url.openStream());
52 FileOutputStream fis =
new FileOutputStream(zipfile);
53 byte[] buffer =
new byte[1024];
55 while ((count = bis.read(buffer, 0, 1024)) != -1) {
56 fis.write(buffer, 0, count);
61 String source = zipfile.getAbsolutePath();
64 ZipFile zipFile =
new ZipFile(source);
65 zipFile.extractAll(destination);
66 }
catch (ZipException e) {
71 File homeDirectory = exe.getParentFile();
72 boolean isWindows = System.getProperty(
"os.name").toLowerCase().startsWith(
"windows");
75 String command = exe +
" --dialogFile "+ttsLocation+
" --machineReadable -f json " + f.getAbsolutePath();
76 System.out.println(command);
77 process = Runtime.getRuntime().exec(command);
79 int exitCode = process.waitFor();
81 InputStream is = process.getInputStream();
82 StringWriter writer =
new StringWriter();
83 String utf8 = StandardCharsets.UTF_8.toString();
84 IOUtils.copy(is, writer, utf8);
85 String result = writer.toString();
88 Type TT_mapStringString =
new TypeToken<HashMap<String, Object>>() {
90 Gson gson =
new GsonBuilder().disableHtmlEscaping().setPrettyPrinting().create();
92 HashMap<String, Object> resultParsed = gson.fromJson(result, TT_mapStringString);
93 double duration = Double
94 .parseDouble(((Map<String, Object>) resultParsed.get(
"metadata")).get(
"duration").toString());
95 List<Map<String, Object>> cues = (List<Map<String, Object>>) resultParsed.get(
"mouthCues");
96 for (Map<String, Object> cue : cues) {
97 double end = Double.parseDouble(cue.get(
"end").toString());
98 double start = Double.parseDouble(cue.get(
"start").toString());
106 timeCodedVisemes.add(map);
115 System.out.println(
"Begin writing..");
116 AudioSystem.write(ais, AudioFileFormat.Type.WAVE, audio);
117 ais = AudioSystem.getAudioInputStream(audio);
120 text.createNewFile();
122 FileWriter myWriter =
new FileWriter(text);
123 myWriter.write(TTSString);
125 }
catch (IOException e) {
130 System.out.println(
"Done writing!");
131 }
catch (Exception e) {
140 double currentDerivitiveTerm,
double percent) {
143 if (timeCodedVisemes.size() > 0) {
146 double value = map.getEndPercentage();
147 if (percent > value) {
148 timeCodedVisemes.remove(0);
149 if (timeCodedVisemes.size() > 0)
150 ret = timeCodedVisemes.
get(0).status;
155 }
else if (percent > map.getStartPercentage())
162 if (current != ret) {
AudioInputStream startProcessing(AudioInputStream ais, String TTSString)
AudioStatus update(AudioStatus current, double amplitudeUnitVector, double currentRollingAverage, double currentDerivitiveTerm, double percent)
static String RhubarbVersion
void processRaw(File f, String ttsLocation)
static File getWorkspace()
static AudioStatus get(char code)