make_cg.scm 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;; ;;;
  3. ;;; Language Technologies Institute ;;;
  4. ;;; Carnegie Mellon University ;;;
  5. ;;; Copyright (c) 2007-2014 ;;;
  6. ;;; All Rights Reserved. ;;;
  7. ;;; ;;;
  8. ;;; Permission is hereby granted, free of charge, to use and distribute ;;;
  9. ;;; this software and its documentation without restriction, including ;;;
  10. ;;; without limitation the rights to use, copy, modify, merge, publish, ;;;
  11. ;;; distribute, sublicense, and/or sell copies of this work, and to ;;;
  12. ;;; permit persons to whom this work is furnished to do so, subject to ;;;
  13. ;;; the following conditions: ;;;
  14. ;;; 1. The code must retain the above copyright notice, this list of ;;;
  15. ;;; conditions and the following disclaimer. ;;;
  16. ;;; 2. Any modifications must be clearly marked as such. ;;;
  17. ;;; 3. Original authors' names are not deleted. ;;;
  18. ;;; 4. The authors' names are not used to endorse or promote products ;;;
  19. ;;; derived from this software without specific prior written ;;;
  20. ;;; permission. ;;;
  21. ;;; ;;;
  22. ;;; CARNEGIE MELLON UNIVERSITY AND THE CONTRIBUTORS TO THIS WORK ;;;
  23. ;;; DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ;;;
  24. ;;; ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT ;;;
  25. ;;; SHALL CARNEGIE MELLON UNIVERSITY NOR THE CONTRIBUTORS BE LIABLE ;;;
  26. ;;; FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ;;;
  27. ;;; WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN ;;;
  28. ;;; AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ;;;
  29. ;;; ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF ;;;
  30. ;;; THIS SOFTWARE. ;;;
  31. ;;; ;;;
  32. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  33. ;;; Author: Alan W Black (awb@cs.cmu.edu) ;;;
  34. ;;; Date: November 2007 ;;;
  35. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  36. ;;; ;;;
  37. ;;; Convert a clustergen voice to flite ;;;
  38. ;;; (Oct 2014) support for random forests ;;;
  39. ;;; ;;;
  40. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  41. ;; Used for getting smaller models, if non-zero this will reduce the
  42. ;; order of the dumped models from whatever it is (probably 24) to this
  43. ;; It does the right thing with statics and dynamics and stddev
  44. (defvar cg:relevant_params nil) ;; a list of param ranges to dump
  45. (defvar cg_reduced_order 0)
  46. (if (> cg_reduced_order 0) ;; just to remind me
  47. (format t "\n***** CG: note reducing order to %d *****\n\n"
  48. cg_reduced_order))
  49. (defvar F0MEAN 0.0)
  50. (defvar F0STD 1.0)
  51. (defvar num_channels_additive_constant 4)
  52. (define (cg_convert name festvoxdir odir)
  53. "(cg_convert name clcatfn clcatfnordered cltreesfn festvoxdir odir)
  54. Convert a festvox clunits (processed) voice into a C file."
  55. (load (format nil "%s/festvox/%s_cg.scm" festvoxdir name))
  56. (eval (list (intern (format nil "voice_%s_cg" name))))
  57. (set! ofd (fopen (path-append odir (string-append name "_cg.c")) "w"))
  58. (format ofd "/*****************************************************/\n")
  59. (format ofd "/** Autogenerated clustergen voice for %s */\n" name)
  60. (format ofd "/*****************************************************/\n")
  61. (format ofd "\n")
  62. (format ofd "#include \"cst_string.h\"\n")
  63. (format ofd "#include \"cst_cg.h\"\n")
  64. (format ofd "#include \"cst_cart.h\"\n")
  65. (format t "cg_convert: converting F0 trees\n")
  66. ;; F0 trees
  67. (set! val_table nil) ;; different val number over the two sets of carts
  68. (cg_convert_carts
  69. (load (format nil "festival/trees/%s_f0.tree" name) t)
  70. "f0" name odir)
  71. (format ofd "\n")
  72. (format ofd "extern const cst_cart * const %s_f0_carts[];\n" name )
  73. (if cg:spamf0
  74. (begin
  75. (set! acctrack (track.load "festival/trees/cb.params"))
  76. (format ofd "extern const cst_cart %s_spamf0_phrase_cart;\n" name)
  77. (format ofd "extern const cst_cart %s_spamf0_accent_cart;\n" name)
  78. (format ofd "extern const float * const %s_spamf0_accent_vectors[];\n" name)
  79. (format ofd "#define %s_spamf0_accent_num_channels %d\n" name (track.num_channels acctrack))
  80. (format ofd "#define %s_spamf0_accent_num_frames %d\n" name (track.num_frames acctrack))
  81. ))
  82. ;; spectral trees
  83. (set! val_table nil) ;; different val number over the two sets of carts
  84. (if cg:rfs_models
  85. (set! pms (load "rf_models/mlist" t))
  86. (set! pms (list '01)))
  87. (if cg:rfs_models
  88. (begin ;; Random Forest Spectral Models
  89. (format t "cg_convert: converting rf spectral trees\n")
  90. (mapcar
  91. (lambda (pm)
  92. (set! old_carttoC_extract_answer carttoC_extract_answer)
  93. (set! carttoC_extract_answer carttoC_extract_spectral_frame)
  94. (set! val_table nil)
  95. (cg_convert_carts
  96. (load (format nil "rf_models/trees_%02d/%s_mcep.tree" pm name) t)
  97. (format nil "%02d_mcep" pm) name odir)
  98. (set! carttoC_extract_answer old_carttoC_extract_answer)
  99. (format ofd "\n")
  100. (format ofd "extern const cst_cart * const %s_%02d_mcep_carts[];\n" name pm)
  101. ;; spectral params
  102. (format t "cg_convert: converting model_%02d spectral params\n" pm)
  103. (cg_convert_params
  104. (format nil "rf_models/trees_%02d/%s_mcep.params" pm name)
  105. (format nil "festival/trees/%s_min_range.scm" name)
  106. name (format nil "%02d" pm) odir ofd)
  107. (format ofd "extern const unsigned short * const %s_%02d_model_vectors[];\n" name pm ))
  108. pms))
  109. (begin ;; Non-random forest spectral models (one model)
  110. (format t "cg_convert: converting single spectral trees\n")
  111. (set! old_carttoC_extract_answer carttoC_extract_answer)
  112. (set! carttoC_extract_answer carttoC_extract_spectral_frame)
  113. (set! val_table nil)
  114. (cg_convert_carts
  115. (load (format nil "festival/trees/%s_mcep.tree" name) t)
  116. "01_mcep" name odir)
  117. (set! carttoC_extract_answer old_carttoC_extract_answer)
  118. (format ofd "\n")
  119. (format ofd "extern const cst_cart * const %s_01_mcep_carts[];\n" name )
  120. ;; spectral params
  121. (format t "cg_convert: converting model_01 spectral params\n")
  122. (cg_convert_params
  123. (format nil "festival/trees/%s_mcep.params" name)
  124. (format nil "festival/trees/%s_min_range.scm" name)
  125. name "01" odir ofd)
  126. (format ofd "extern const unsigned short * const %s_01_model_vectors[];\n" name )
  127. ))
  128. (format ofd "#define %s_num_param_models %d\n" name (length pms))
  129. (format ofd "const int %s_num_channels_table[] = {\n" name)
  130. (mapcar
  131. (lambda (pm)
  132. (format ofd " %s_%02d_num_channels,\n" name pm))
  133. pms)
  134. (format ofd "0};\n")
  135. (format ofd "const int %s_num_frames_table[] = {\n" name)
  136. (mapcar
  137. (lambda (pm)
  138. (format ofd " %s_%02d_num_frames,\n" name pm))
  139. pms)
  140. (format ofd "0};\n")
  141. (format ofd "const unsigned short **%s_model_vectors_table[] = {\n" name)
  142. (mapcar
  143. (lambda (pm)
  144. (format ofd " %s_%02d_model_vectors,\n" name pm))
  145. pms)
  146. (format ofd "NULL};\n")
  147. (format ofd "const cst_cart **%s_mcep_carts_table[] = {\n" name)
  148. (mapcar
  149. (lambda (pm)
  150. (format ofd " %s_%02d_mcep_carts,\n" name pm))
  151. pms)
  152. (format ofd "NULL};\n")
  153. ;; duration model (cart conversion)
  154. (if cg:rfs_dur_models
  155. (set! dms (load "dur_rf_models/mlist" t))
  156. (set! dms '(01)))
  157. (if cg:rfs_dur_models
  158. (begin
  159. (format t "cg_convert: converting rf duration models\n")
  160. (mapcar
  161. (lambda (dm)
  162. (format t "cg_convert: converting %02d duration model\n" dm)
  163. (set! val_table nil)
  164. (cg_convert_durmodel
  165. (format nil "dur_rf_models/dur_%02d/%s_durdata_cg.scm" dm name)
  166. (format nil "%s_cg_%02d_" name dm) odir)
  167. (format ofd "extern const dur_stat * const %s_cg_%02d_dur_stats[];\n" name dm)
  168. (format ofd "extern const cst_cart %s_cg_%02d_dur_cart;\n" name dm))
  169. dms))
  170. (begin
  171. (format t "cg_convert: converting single duration model\n")
  172. (format t "cg_convert: converting 01 duration model\n")
  173. (cg_convert_durmodel
  174. (format nil "festvox/%s_durdata_cg.scm" name)
  175. (format nil "%s_cg_%02d_" name 01) odir)
  176. (format ofd "extern const dur_stat * const %s_cg_%02d_dur_stats[];\n" name 01)
  177. (format ofd "extern const cst_cart %s_cg_%02d_dur_cart;\n" name 01)
  178. ))
  179. (format ofd "#define %s_num_dur_models %d\n" name (length dms))
  180. (format ofd "const dur_stat **%s_dur_stats_table[] = {\n" name)
  181. (mapcar
  182. (lambda (dm)
  183. (format ofd " %s_cg_%02d_dur_stats,\n" name dm))
  184. dms)
  185. (format ofd "NULL};\n")
  186. (format ofd "const cst_cart *%s_dur_cart_table[] = {\n" name)
  187. (mapcar
  188. (lambda (dm)
  189. (format ofd " &%s_cg_%02d_dur_cart,\n" name dm))
  190. dms)
  191. (format ofd "NULL};\n")
  192. ;; phone to states
  193. (format t "cg_convert: converting phone to state map\n")
  194. (cg_phone_to_states
  195. (format nil "festvox/%s_statenames.scm" name)
  196. name odir)
  197. (format ofd "extern const char * const *%s_phone_states[];\n" name)
  198. (format ofd "\n")
  199. (format ofd "const char * const %s_types[] = {\n" name)
  200. (mapcar
  201. (lambda (cart)
  202. (format ofd " \"%s\",\n" (car cart)))
  203. (load (format nil "festival/trees/%s_f0.tree" name) t))
  204. (format ofd " NULL};\n")
  205. (format ofd "#define %s_num_types %d\n\n"
  206. name
  207. (length (load (format nil "festival/trees/%s_f0.tree" name) t)))
  208. (format ofd "const float %s_model_min[] = { \n" name)
  209. (mapcar
  210. (lambda (p)
  211. (format ofd " %f,\n" (car p)))
  212. (reverse new_min_range))
  213. (format ofd "};\n")
  214. (format ofd "const float %s_model_range[] = { \n" name)
  215. (mapcar
  216. (lambda (p)
  217. (format ofd " %f,\n" (cadr p)))
  218. (reverse new_min_range))
  219. (format ofd "};\n")
  220. (format ofd "const float %s_dynwin[] = { -0.5, 0.0, 0.5 };\n" name)
  221. (format ofd "#define %s_dynwinsize 3\n" name)
  222. (if cg:mixed_excitation
  223. (begin
  224. ;; Uses filters in festvox/mef.track (from Jan 2013)
  225. (set! n 0)
  226. (while (< n 5)
  227. (format ofd "const double %s_me_filter_%d[] = {\n" name n)
  228. (set! o 0)
  229. (while (< o 46)
  230. (format ofd "%f, " (track.get me_filter_track n o))
  231. (set! o (+ o 1)))
  232. (format ofd "%f\n};\n" (track.get me_filter_track n o))
  233. (set! n (+ n 1))
  234. )
  235. (format ofd "const double * const %s_me_h[] = {\n" name)
  236. (format ofd " %s_me_filter_0,\n" name)
  237. (format ofd " %s_me_filter_1,\n" name)
  238. (format ofd " %s_me_filter_2,\n" name)
  239. (format ofd " %s_me_filter_3,\n" name)
  240. (format ofd " %s_me_filter_4\n" name)
  241. (format ofd "};\n\n")
  242. ))
  243. (format ofd "const cst_cg_db %s_cg_db = {\n" name)
  244. (format ofd " \"%s\",\n" name)
  245. (format ofd " %s_types,\n" name)
  246. (format ofd " %s_num_types,\n" name)
  247. (if (boundp 'framerate)
  248. (format ofd " %d,\n" framerate) ;; sample rate
  249. (format ofd " 16000,\n")) ;; sample rate
  250. (format ofd " %f,%f,\n" F0MEAN F0STD)
  251. (format ofd " %s_f0_carts,\n" name)
  252. (format ofd " %s_num_param_models,\n" name)
  253. (format ofd " %s_mcep_carts_table,\n" name)
  254. (if cg:spamf0
  255. (begin
  256. (set! mfd (fopen (path-append odir "paramfiles.mak") "a"))
  257. (format mfd "SPAMF0=true\n")
  258. (fclose mfd)
  259. (format ofd " &%s_spamf0_accent_cart,\n" name)
  260. (format ofd " &%s_spamf0_phrase_cart,\n" name)
  261. )
  262. (begin
  263. (set! mfd (fopen (path-append odir "paramfiles.mak") "a"))
  264. (format mfd "SPAMF0=false\n")
  265. (fclose mfd)
  266. (format ofd " NULL,NULL,\n")
  267. )
  268. )
  269. (format ofd " %s_num_channels_table,\n" name)
  270. (format ofd " %s_num_frames_table,\n" name)
  271. (format ofd " %s_model_vectors_table,\n" name)
  272. (if cg:spamf0
  273. (begin
  274. (format ofd " %s_spamf0_accent_num_channels,\n" name)
  275. (format ofd " %s_spamf0_accent_num_frames,\n" name)
  276. (format ofd " %s_spamf0_accent_vectors,\n" name)
  277. )
  278. (format ofd " 0,0,NULL,\n")
  279. )
  280. (format ofd " %s_model_min,\n" name)
  281. (format ofd " %s_model_range,\n" name)
  282. (format ofd " %f, /* frame_advance */\n" cg:frame_shift)
  283. (format ofd " %s_num_dur_models,\n" name)
  284. (format ofd " %s_dur_stats_table,\n" name)
  285. (format ofd " %s_dur_cart_table,\n" name)
  286. (format ofd " %s_phone_states,\n" name)
  287. (format ofd " 1, /* 1 if mlpg required */\n")
  288. (format ofd " %s_dynwin,\n" name)
  289. (format ofd " %s_dynwinsize,\n" name)
  290. (format ofd " %f, /* mlsa_alpha */\n" mlsa_alpha_param)
  291. (format ofd " %f, /* mlsa_beta */\n" 0.4)
  292. (if cg:multimodel
  293. (format ofd " 1, /* cg:multimodel */\n")
  294. (format ofd " 0, /* cg:multimodel */\n"))
  295. (if cg:mixed_excitation
  296. (begin
  297. (format ofd " 1, /* cg:mixed_excitation */\n")
  298. (format ofd " 5,48, /* filter sizes */\n")
  299. (format ofd " %s_me_h, \n" name))
  300. (begin
  301. (format ofd " 0, /* cg:mixed_excitation */\n")
  302. (format ofd " 0,0, /* cg:mixed_excitation */\n")
  303. (format ofd " NULL, \n")))
  304. (if cg:spamf0
  305. (format ofd " 1, // cg:spamf0\n")
  306. (format ofd " 0, // cg:spamf0\n"))
  307. (format ofd " 1.5 /* gain */\n")
  308. (format ofd "};\n")
  309. (fclose ofd)
  310. )
  311. (define (unit_type u)
  312. (apply
  313. string-append
  314. (reverse
  315. (symbolexplode
  316. (string-after
  317. (apply
  318. string-append
  319. (reverse (symbolexplode u)))
  320. "_")))))
  321. (define (unit_occur u)
  322. (apply
  323. string-append
  324. (reverse
  325. (symbolexplode
  326. (string-before
  327. (apply
  328. string-append
  329. (reverse (symbolexplode u)))
  330. "_")))))
  331. (define (cg_convert_durmodel durmodelfn name odir)
  332. (set! durmodel (load durmodelfn t))
  333. (set! phonedurs (cadr (car (cddr (car durmodel)))))
  334. (set! zdurtree (cadr (car (cddr (cadr durmodel)))))
  335. (set! dfd (fopen (path-append odir (string-append name "durmodel.c")) "w"))
  336. (set! dfdh (fopen (path-append odir (string-append name "durmodel.h")) "w"))
  337. (format dfd "/*****************************************************/\n")
  338. (format dfd "/** Autogenerated durmodel_cg for %s */\n" name)
  339. (format dfd "/*****************************************************/\n")
  340. (format dfd "#include \"cst_synth.h\"\n")
  341. (format dfd "#include \"cst_string.h\"\n")
  342. (format dfd "#include \"cst_cart.h\"\n")
  343. (format dfd "#include \"%sdurmodel.h\"\n\n" name)
  344. (mapcar
  345. (lambda (s)
  346. (format dfd "static const dur_stat dur_state_%s = { \"%s\", %f, %f };\n"
  347. (cg_normal_phone_name (car s))
  348. (car s) (car (cdr s)) (car (cddr s)))
  349. )
  350. phonedurs)
  351. (format dfd "\n")
  352. (format dfd "const dur_stat * const %sdur_stats[] = {\n" name)
  353. (mapcar
  354. (lambda (s)
  355. (format dfd " &dur_state_%s,\n" (cg_normal_phone_name (car s))))
  356. phonedurs)
  357. (format dfd " NULL\n};\n")
  358. (set! val_table nil)
  359. (set! current_node -1)
  360. (set! feat_nums nil)
  361. (do_carttoC dfd dfdh
  362. (format nil "%s%s" name "dur")
  363. zdurtree)
  364. (fclose dfd)
  365. (fclose dfdh)
  366. )
  367. (define (cg_phone_to_states phonestatefn name odir)
  368. (set! dfd (fopen (path-append odir (string-append name "_cg_phonestate.c")) "w"))
  369. (format dfd "/*****************************************************/\n")
  370. (format dfd "/** Autogenerated phonestate_cg for %s */\n" name)
  371. (format dfd "/*****************************************************/\n")
  372. (set! phonestates (load phonestatefn t))
  373. (mapcar
  374. (lambda (x)
  375. (format dfd "const char * const %s_%s_ps[] = { " name
  376. (cg_normal_phone_name (car x)))
  377. (mapcar
  378. (lambda (y) (format dfd "\"%s\", " y))
  379. x)
  380. (format dfd " 0};\n"))
  381. (cadr (caddr (car phonestates))))
  382. (format dfd "const char * const * const %s_phone_states[] = {\n" name)
  383. (mapcar
  384. (lambda (x)
  385. (format dfd " %s_%s_ps,\n" name
  386. (cg_normal_phone_name (car x))))
  387. (cadr (caddr (car phonestates))))
  388. (format dfd " 0};\n")
  389. (fclose dfd)
  390. )
  391. (define (cg_convert_params mcepfn mcepminrangefn name type odir cofd)
  392. (let ((param.track (track.load mcepfn))
  393. (i 0) (mfd))
  394. (set! mfd (fopen (path-append odir (string-append name "_cg_" type "_params.c")) "w"))
  395. (format mfd "/*****************************************************/\n")
  396. (format mfd "/** Autogenerated model_vectors for %s */\n" name)
  397. (format mfd "/*****************************************************/\n")
  398. (set! num_channels (track.num_channels param.track))
  399. (set! num_frames (track.num_frames param.track))
  400. ;; Output each frame
  401. (set! mcep_min_range (load mcepminrangefn t))
  402. (while (< i num_frames)
  403. (output_param_frame name type param.track i mfd)
  404. (set! i (+ 1 i)))
  405. (format mfd "\n\n")
  406. ;; Output each frame
  407. (format mfd "const unsigned short * const %s_%s_model_vectors[] = {\n" name type)
  408. (set! i 0)
  409. (while (< i num_frames)
  410. (format mfd " %s_%s_param_frame_%d,\n" name type i)
  411. (set! i (+ 1 i)))
  412. (format mfd "};\n\n")
  413. (if cg:mixed_excitation
  414. (begin
  415. (set! num_channels_additive_constant 14)
  416. ))
  417. (if (> cg_reduced_order 0)
  418. (format cofd "#define %s_%s_num_channels %d\n"
  419. name type (+ num_channels_additive_constant (* 4 cg_reduced_order)))
  420. (format cofd "#define %s_%s_num_channels %d\n" name type num_channels))
  421. (format cofd "#define %s_%s_num_frames %d\n" name type num_frames)
  422. (fclose mfd)
  423. ))
  424. (define (mcepcoeff_norm c min range)
  425. (let ((x (* (/ (- c min) range) 65535)))
  426. (cond
  427. ((< x 0) 0.0)
  428. ((> x 65535) 65535)
  429. (t x))))
  430. (define (output_accent_frame name track f ofd)
  431. "(output_accent_frame name track frame ofd)
  432. Ouput this accent params."
  433. (let ((i 0) (nc (track.num_channels track)))
  434. ;(format ofd "static const unsigned short %s_spamf0_accent_frame_%d[] = { \n" name f)
  435. (format ofd "static const float %s_spamf0_accent_frame_%d[] = { \n" name f)
  436. (while (< i nc)
  437. (format ofd " %f," (track.get track f i))
  438. (set! i (+ 1 i)))
  439. (format ofd " };\n")
  440. )
  441. )
  442. (define (output_param_frame name type track f ofd)
  443. "(output_param_frame name track frame ofd)
  444. Ouput this frame."
  445. (let ((i 0) (nc (track.num_channels track)))
  446. (format ofd "static const unsigned short %s_%s_param_frame_%d[] = { \n" name type f)
  447. (set! min_range mcep_min_range)
  448. (set! real_order (/ (- nc 4) 4))
  449. (set! new_min_range nil)
  450. (if cg:relevant_params
  451. (begin ;; specified number of parameters
  452. )
  453. (if cg:mixed_excitation
  454. (begin
  455. (while (< i nc)
  456. (if (or (eq cg_reduced_order 0)
  457. (< i (* 2 (+ 1 cg_reduced_order))) ;; static and static_stddev
  458. (and (> i (- (/ (- nc 10) 2) 1)) ;; deltas and delta_stddev
  459. (< i (+ (/ (- nc 10) 2) (* 2 cg_reduced_order))))
  460. (> i (- nc 13)))
  461. (begin
  462. ; (format t "i is %d %d\n" i (+ (/ nc 2) (* 2 cg_reduced_order)))
  463. (format ofd " %d,"
  464. (mcepcoeff_norm
  465. (track.get track f i)
  466. (caar min_range)
  467. (cadr (car min_range))))
  468. (set! new_min_range (cons (car min_range) new_min_range))
  469. ))
  470. (set! min_range (cdr min_range))
  471. (set! i (+ 1 i)))
  472. (format ofd " };\n")
  473. )
  474. (begin
  475. (while (< i nc)
  476. (if (or (eq cg_reduced_order 0)
  477. (< i (* 2 (+ 1 cg_reduced_order))) ;; static and static_stddev
  478. (and (> i (- (/ nc 2) 1)) ;; deltas and delta_stddev
  479. (< i (+ (/ nc 2) (* 2 cg_reduced_order))))
  480. (> i (- nc 3)))
  481. (begin
  482. ; (format t "i is %d %d\n" i (+ (/ nc 2) (* 2 cg_reduced_order)))
  483. (format ofd " %d,"
  484. (mcepcoeff_norm
  485. (track.get track f i)
  486. (caar min_range)
  487. (cadr (car min_range))))
  488. (set! new_min_range (cons (car min_range) new_min_range))
  489. ))
  490. (set! min_range (cdr min_range))
  491. (set! i (+ 1 i)))
  492. (format ofd " };\n")
  493. )))
  494. )
  495. )
  496. (define (carttoC_extract_spectral_frame ofdh tree)
  497. "(carttoC_extract_spectral_frame tree)
  498. Get list of answers from leaf node."
  499. (carttoC_val_table ofdh
  500. (car (car tree))
  501. 'none))
  502. (define (cg_convert_carts carts prefix name odir)
  503. "(define cg_convert_carts cartfn name)
  504. Output cg selection carts into odir/name_carts.c"
  505. (let (ofd ofdh)
  506. ;; Set up to dump full list of things at leafs
  507. ;; default processing of leaf (int or float) is fine
  508. (set! ofd (fopen (format nil "%s/%s_cg_%s_trees.c" odir name prefix) "w"))
  509. (set! ofdh (fopen (format nil "%s/%s_cg_%s_trees.h" odir name prefix) "w"))
  510. (format ofd "/*****************************************************/\n")
  511. (format ofd "/** Autogenerated %s %s carts */\n" name prefix)
  512. (format ofd "/*****************************************************/\n")
  513. (format ofd "\n")
  514. (format ofd "#include \"cst_string.h\"\n")
  515. (format ofd "#include \"cst_cart.h\"\n")
  516. (format ofd "#include \"%s_cg_%s_trees.h\"\n" name prefix)
  517. (mapcar
  518. (lambda (cart)
  519. (if (string-equal "string" (typeof (car cart)))
  520. (begin
  521. (set! current_node -1)
  522. (set! feat_nums nil)
  523. (do_carttoC ofd ofdh
  524. (format nil "%s_%s_%s" name prefix
  525. (cg_normal_phone_name (car cart)))
  526. (cadr cart)))))
  527. carts)
  528. (format ofd "\n\n")
  529. (format ofd "const cst_cart * const %s_%s_carts[] = {\n" name prefix)
  530. (mapcar
  531. (lambda (cart)
  532. (if (string-equal "string" (typeof (car cart)))
  533. (format ofd " &%s_%s_%s_cart,\n" name prefix
  534. (cg_normal_phone_name (car cart))))
  535. )
  536. carts)
  537. (format ofd " 0 };\n")
  538. (fclose ofd)
  539. (fclose ofdh)
  540. )
  541. )
  542. (define (cg_normal_phone_name x)
  543. (cg_normal_phone_name_base
  544. (cg_normal_phone_name_base
  545. (cg_normal_phone_name_base x))))
  546. (define (cg_normal_phone_name_base x)
  547. ;; Some phone names aren't valid C labels
  548. (cond
  549. ((string-matches x ".*@.*" x)
  550. (intern
  551. (string-append
  552. (string-before x "@")
  553. "atsign"
  554. (string-after x "@"))))
  555. ((string-matches x ".*:.*")
  556. (intern
  557. (string-append
  558. (string-before x ":")
  559. "sc"
  560. (string-after x ":"))))
  561. ((string-matches x ".*=.*")
  562. (intern
  563. (string-append
  564. (string-before x "=")
  565. "eq"
  566. (string-after x "="))))
  567. ((string-matches x ".*>.*")
  568. (intern
  569. (string-append
  570. (string-before x ">")
  571. "gt"
  572. (string-after x ">"))))
  573. ((string-matches x ".*}.*")
  574. (intern
  575. (string-append
  576. (string-before x "}")
  577. "rb"
  578. (string-after x "}"))))
  579. ((string-matches x ".*~.*")
  580. (intern
  581. (string-append
  582. (string-before x "~")
  583. "tilde"
  584. (string-after x "~"))))
  585. (t x)))
  586. (provide 'make_cg)