14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * use this file except in compliance with the License. You may obtain a copy of 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the License at 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * License for the specific language governing permissions and limitations under 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * the License. 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */ 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// This converts the data found at http://www.speech.cs.cmu.edu/cgi-bin/cmudict 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// into the *.ok format used by Nuance. 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// We use the file c0.6, which corresponds to (v. 0.6). 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// to run: make cmu2nuance && ./cmu2nuance <c0.6 >c0.6.ok 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// TODO: look at generation of 'L', ')', and ',' 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h> 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h> 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ctype.h> 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic const char* xlate(const char* phone, const char* cmu, const char* nuance) { 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ncmu = strlen(cmu); 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (strncmp(phone, cmu, ncmu) || !isspace(phone[ncmu])) return NULL; 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fputs(nuance, stdout); 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return phone + strlen(cmu); 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint main(int argc, const char* argv[]) { 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project char line[200]; 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fputs("#LANG=EN-US\n", stdout); 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int lineno = 1; NULL != fgets(line, sizeof(line), stdin); lineno++) 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project { 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (line[0] == '#') continue; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (line[0] == 0) continue; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (!isalnum(line[0])) { 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fprintf(stderr, "warning: ignoring line %d - %s", lineno, line); 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project continue; 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const char* p = line; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // parse name, echoing in lower case and skipping (2) suffix 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (!isspace(*p)) { 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*p == 0) { 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fprintf(stderr, "can't read name at line %d\n", lineno); 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (p[0] == '(' && isdigit(p[1]) && p[2] == ')' && isspace(p[3])) { 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p += 3; 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fputc(tolower(*p), stdout); 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p++; 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fputc(' ', stdout); 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // loop over whitespace delimited phonemes 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (1) { 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // skip leading whitespace 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (isspace(*p)) p++; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (*p == 0) break; 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project const char* next = 0; 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ( 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AA1 R", ")r")) || // odd AA D 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AA0", "o")) || // odd AA D 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AA1", "o")) || // odd AA D 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AA2", "o")) || // odd AA D 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AE0", "a")) || // at AE T 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AE1", "a")) || // at AE T 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AE2", "a")) || // at AE T 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// (next=xlate(p, "AH0 L", "L")) || // drops accuracy by 1% 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AH0 N", "~")) || // hut HH AH T - from jean 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AH0 M", "}")) || // hut HH AH T - from jean 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AH0", "@")) || // hut HH AH T - from jean 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AH1", "u")) || // hut HH AH T 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AH2", "u")) || // hut HH AH T 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AO0", "{")) || // ought AO T 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AO1", "{")) || // ought AO T 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AO2", "{")) || // ought AO T 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AW0", "?")) || // cow K AW 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AW1", "?")) || // cow K AW 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AW2", "?")) || // cow K AW 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AY0", "I")) || // hide HH AY D 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AY1", "I")) || // hide HH AY D 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "AY2", "I")) || // hide HH AY D 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "B" , "b")) || // be B IY 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "CH" , "C")) || // cheese CH IY Z 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "D" , "d")) || // dee D IY 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "DH" , "D")) || // thee DH IY 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EH1 R", ",r")) || // Ed EH D 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EH0", "c")) || // Ed EH D - from jean 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EH1", "e")) || // Ed EH D 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EH2", "e")) || // Ed EH D 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "ER0", "P")) || // hurt HH ER T 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "ER1", "V")) || // hurt HH ER T 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "ER2", "V")) || // hurt HH ER T 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EY0", "A")) || // ate EY T 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EY1", "A")) || // ate EY T 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "EY2", "A")) || // ate EY T 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "F" , "f")) || // fee F IY 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "G" , "g")) || // green G R IY N 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "HH" , "h")) || // he HH IY 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IH0", "6")) || // it IH T 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IH1", "i")) || // it IH T 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IH2", "i")) || // it IH T 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IY0", "/")) || // eat IY T - from jean 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IY1", "E")) || // eat IY T 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "IY2", "E")) || // eat IY T 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "JH" , "j")) || // gee JH IY 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "K" , "k")) || // key K IY 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "L" , "l")) || // lee L IY 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "M" , "m")) || // me M IY 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "N" , "n")) || // knee N IY 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "NG" , "N")) || // ping P IH NG 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OW0", "]")) || // oat OW T 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OW1", "O")) || // oat OW T 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OW2", "O")) || // oat OW T 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OY0", "<")) || // toy T OY 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OY1", "<")) || // toy T OY 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "OY2", "<")) || // toy T OY 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "P" , "p")) || // pee P IY 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "R" , "r")) || // read R IY D 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "S" , "s")) || // sea S IY 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "SH" , "S")) || // she SH IY 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "T" , "t")) || // tea T IY 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "TH" , "T")) || // theta TH EY T AH 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UH0", "q")) || // hood HH UH D 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UH1", "q")) || // hood HH UH D 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UH2", "q")) || // hood HH UH D 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UW0", "U")) || // two T UW 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UW1", "U")) || // two T UW 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "UW2", "U")) || // two T UW 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "V" , "v")) || // vee V IY 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "W" , "w")) || // we W IY 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "Y" , "y")) || // yield Y IY L D 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "Z" , "z")) || // zee Z IY 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (next=xlate(p, "ZH" , "Z")) || // seizure S IY ZH ER 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 0) { 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project p = next; 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fprintf(stderr, "can't pronounce line %d: %s", lineno, p); 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project fputc('\n', stdout); 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 187