#!/usr/bin/env ruby
# encoding: UTF-8
# $KCODE = 'u'
require 'nkf'

gtalk_bin = "/usr/local/galatea-dialog/bin/gtalk" # for utf8
# gtalk_bin = "/usr/local/galatea-engine/SSM/gtalk/gtalk" # for euc-jp
gdm_jar = "/lab/common/src/nishi/sfjp/dialog-studio-java/bin/gdm.jar"

if ARGV.length == 1
  outputname = ARGV[0]
  text = STDIN.read
elsif ARGV.length == 2
  outputname = ARGV[0]
  text = File.open(ARGV[1]).read.chomp
else
  puts "Usage 1: echo '12345' | script/text2wav outputname"
  puts "Usage 2: script/text2wav outputname input.txt"
  exit
end

outputdir = File.join(Dir.pwd, outputname)
speaker = "female01"
text = NKF.nkf('-w', text)

####################
# based on script/runner
####################
$runner_dir = File.expand_path(File.join(File.dirname(__FILE__), '..'))
$skel_dir = File.expand_path(File.join(File.dirname(__FILE__), '../skel'))
$tmp_dir = File.expand_path(File.join(File.dirname(__FILE__), '../tmp'))
$generator_dir = "/usr/local/galatea-dialog"
[ $runner_dir, $generator_dir ].each do |d|
  f2 = File.join(d, 'lib', 'galatea_runner.rb')
  if File.exist?(f2)
    $library_dir = File.join(d , 'lib')
    %w[ helper.rb yaml_reader.rb config_maker.rb galatea_config_maker.rb ].each do |f|
      require File.join($library_dir, f)
    end
    # puts "using " + $library_dir
    break
  end
end
####################
# based on galatea_runner.rb
####################
dm_conf_options = []
galatea_lang = 'ja'
dry_run = false
preprocess_only = false
config_yml_array = []
# puts "[runner_dir] " + $runner_dir
ar = [ File.join($runner_dir, 'runner.yml'), File.join($runner_dir, 'config', 'runner.yml') ]
if $generator_dir
  ar << File.join($generator_dir, 'runner.yml')
end
ar << "/usr/local/galatea-dialog/runner.yml"
# puts "[config candidate] " + ar.join(' ')
ar.each do |f|
  if File.exist?(f)
    config_yml_array << f
  end
end
# puts "[config] " + config_yml_array.join(' ')
m = GalateaConfigMaker.new(config_yml_array)
m.verbose = true
m.set_dm_options dm_conf_options, [] # m.set_dm_options dm_conf_options, ARGV
m.set_lang galatea_lang
m.mkdir_tmppath
m.preprocess_only = preprocess_only
%w[ julius.conf gdm.conf fsm.conf ssm.conf chasenrc-euc-jp gtalk-euc-jp.dic am.conf am_mcl.conf ].each do |f|
  m.make f
end
# system m.runner_cmd
####################
# based on gtalk/RUN (perl script)
####################
require 'open3'
ssmconf = $tmp_dir + '/ssm.conf'
cmd = "cd /usr/local/galatea-engine/SSM/gtalk; #{gtalk_bin} -C #{ssmconf}"
# puts text
# puts cmd
FileUtils.mkdir_p outputname
system "mv #{outputdir}/#{outputname}.log #{outputdir}/#{outputname}.log.bak"
Open3.popen3("#{cmd} >&2") do |stdin, stdout, stderr|
  stdin.puts "set Log = #{outputdir}/#{outputname}.log.eucjp"
  stdin.puts "set Log.conf = YES"
  stdin.puts "set Log.text = YES"
  stdin.puts "set Log.arrangedText = YES"
  stdin.puts "set Log.chasen = YES"
  stdin.puts "set Log.tag = YES"
  stdin.puts "set Log.phoneme = YES"
  stdin.puts "set Log.mora = YES"
  stdin.puts "set Log.morph = YES"
  stdin.puts "set Log.aphrase = YES"
  stdin.puts "set Log.breath = YES"
  stdin.puts "set Log.sentence = YES"
  stdin.puts "prop Text.text = AutoOutput"
  stdin.puts "prop Text.pho = AutoOutput"
  stdin.puts "prop Text.dur = AutoOutput"
  stdin.puts "prop Speak.text = AutoOutput"
  stdin.puts "prop Speak.utt = AutoOutput"
  stdin.puts "prop Speak.len = AutoOutput"
  stdin.puts "prop Speak.stat = AutoOutput"
  stdin.puts "set Speaker = #{speaker}"
  stdin.puts "set Text = #{text}"
  stdin.puts "set SaveWAV = #{outputdir}/#{outputname}.wav"
  stdin.puts "set SavePros = #{outputdir}/#{outputname}.pros.eucjp"
  stdin.puts "set Run = EXIT"
  stdin.close_write
  File.open("#{outputdir}/#{outputname}.runner_log", "w") do |rlog|
    rlog.puts "stdout:\n" + stdout.read
    rlog.puts "stderr:\n" + stderr.read
  end
end
system "nkf -Ew #{outputdir}/#{outputname}.log.eucjp > #{outputdir}/#{outputname}.log"
system "nkf -Ew #{outputdir}/#{outputname}.pros.eucjp > #{outputdir}/#{outputname}.pros"
system "mv #{outputdir}/#{outputname}.wav.info #{outputdir}/#{outputname}.wav.info.eucjp"
system "nkf -Ew #{outputdir}/#{outputname}.wav.info.eucjp > #{outputdir}/#{outputname}.wav.info"

#######################################
# get phonemes in phrases
#######################################

# find "* aphrase data"

lines = []
flag = false
File.open("#{outputdir}/#{outputname}.log", "r").each_line do |line|
  s = line.chomp
  if s.match(/^\* aphrase data/)
    if lines.length == 0
      flag = true
    end
  elsif s.match(/^\- n_aphrase:/)
    flag = false
  end
  if flag
    if (not s.match(/^\* aphrase data/)) and (not s.match(/^\(orth/))
      lines << s
    end
  end
end
# (orth	pron	[accent]	mora	position	DEC/INT

lines2 = []
lines.each do |s| 
  s2 = s.split(/\t/)[1]
  s3 = NKF.nkf('-w --hiragana', s2)
  lines2 << s3
  # puts s3
end

cmd = "LANG=ja_JP.utf8; java -cp #{gdm_jar} galatea.io.julius.GrammarUtil -t"
lines3 = []
Open3.popen3(cmd) do |stdin, stdout, stderr|
  lines2.each do |s|
    stdin.puts s
  end
  stdin.close_write
  s = stdout.gets
  while s 
    lines3 << [s.chomp] # make array
    s = stdout.gets
  end
end
phrases = lines3

phrases.each_with_index do |item, idx|
  item << lines2[idx]
end

# p phrases
# [["silB;", "silB"], ["w;a;t;a;k;U;sh;i;w;a;", "わたくしわ"], 
# ["o;N;s;e;e;g;o;o;s;e;e;k;i;d;e;s;U;", "おんせーごーせーきです"], 
# ["silE;", "silE"]]

#######################################
# parse .pros file
#######################################

separator_count = 0
durations = []
File.open("#{outputdir}/#{outputname}.pros", "r").each_line do |line|
  s = line.chomp
  if s == "-----" 
    separator_count += 1
  end
  if separator_count == 1 and (s != "-----")
    # w [40]
    m = s.match(/^(\S+) \[(\d+)\]$/)
    durations << [ m[1], m[2] ]
  end
end

# p durations

#######################################
# output
#######################################

lines = []
count = 0
clock = 0
phrases.each do |phrase|
  lines << "----- " + phrase[1]
  phrase[0].split(/;/).each do |i|
    d = durations[count]
    dur = d[1].to_i
    starttime = clock
    endtime = clock + dur
    lines << starttime.to_s + " " + endtime.to_s + " " + d[0] + " " + i + " " + dur.to_s
    clock += dur
    count += 1
  end
end
lines << "-----"
File.open("#{outputdir}/#{outputname}.phrase_dur", "w") do |file|
  lines.each do |s|
    file.puts s
  end
end
