最近几天我一直在广泛研究一个问题,正如标题所表明的,这与将字符串解析为音素的文本到语音类型算法有关。
我不打算将其用于文本到语音的转换,大多数情况下我只是打算对即将进行的项目进行文本分析。我在这里找到了一些有用的信息:
http://www.dtic.mil/dtic/tr/fulltext/u2/a021929.pdf
使用此信息,我希望创建一个类似的工具。这是上述软件的工作方式:
基本上,从字符串的第一个字符开始,我们检查字符串的左右两个字符。
(对于单词开头的字符,左字符将为空格)
我们基于44种英语音素以及适合每个音素的字素来建立规则。
在这里,我获得了构成以下规则的数据: http://www.boardman.k12.oh.us/userfiles/363/Phonological%20Awareness/44Phonemes.pdf-我认为与前一篇文章中的某些规则不同。
这是到目前为止我创建的规则对象的一个示例:
var rules_syntax = {
cons_b: {case:["b", "bb"], pro: "b"},
cons_d: {case:["d", "dd", "ed"], pro: "d"},
cons_f: {case:["f", "ph"], pro: "f"},
cons_g: {case:["g", "gg"], pro: "g"},
cons_h: {case:["h"], pro: "h"},
cons_j: {case:["j", "g", "ge", "dge"], pro: "j"},
cons_k: {case:["c", "k", "ck", "ch", "cc", "que"], pro: "k"},
cons_l: {case:["l", "ll"], pro: "l"},
cons_m: {case:["m", "mm", "mb"], pro: "m"},
cons_n: {case:["n", "nn", "kn", "gn"], pro: "n"},
cons_p: {case:["p", "pp"], pro: "p"},
cons_r: {case:["r", "rr", "wr"], pro: "r"},
cons_s: {case:["s", "se", "ss", "ci", "ce", "sc"], pro: "s"},
cons_t: {case:["t", "tt", "ed"], pro: "t"},
cons_v: {case:["v", "ve"], pro: "v"},
cons_w: {case:["w"], pro: "w"},
cons_y: {case:["y", "oi", "io"], pro: "y"},
cons_z: {case:["z", "zz", "ze", "se", "x"], pro: "z"},
cons_diag_th: {case:["th"], pro: "th"},
cons_diag_th_voice: {case:["th"], pro: "thh"},
cons_diag_ng: {case:["ng", "n"], pro: "n"},
cons_diag_sh: {case:["sh", "ss", "ch", "ti", "ci"], pro: "sh"},
cons_diag_ch: {case:["ch", "tch"], pro: "ch"},
cons_diag_zh: {case:["ge", "s"], pro: "zh"},
cons_diag_wh: {case:["wh"], pro: "w"},
shor_vowe_a: {case: ["a", "au"], pro: "a"},
shor_vowe_e: {case: ["e", "ea"], pro: "e"},
shor_vowe_i: {case: ["i"], pro: "i"},
shor_vowe_o: {case: ["o", "a", "au", "aw", "ough"], pro: "o"},
shor_vowe_u: {case: ["u", "o"], pro: "u"},
}
希望这足以使您理解。
第一篇文章也有以下规则,我还没有完全弄清楚如何实现。 -对此的任何建议都很好
'#'一个或多个元音
'*'(星号)一个或多个辅音
'*'(圆圈)B,D,V,G,J,L,M,N,R,W和Z中的一个:有声辅音
'$'一个辅音,后跟一个E或I
'%'(ER,E,ES,ED,ING,ELY)之一:后缀
'&'(S,C,G,Z,X,J,CH,SH)之一:助音剂
'@'(T,S,R,D,L,Z,N,J,TH,CH,SH)中的一个 跟随很长u的声音(参见规则和m子)
'^'一个辅音
'+'(E,I,Y)中的一个:前元音
':'零个或多个辅音
我的第一个问题是:
是否有人认为这是处理这些规则的适当方法?请提出建议。
继续前进,
一旦我们知道主要字符是什么,以及左右字符是什么,我们就会检查适用于该字符组的所有规则。发表的第一篇文章解释了
翻译算法从左到右扫描输入文本,并针对每个扫描的字符,依次搜索与该字符相关的规则,直到找到其左侧匹配文本在正确的位置。
这是我目前遇到的问题。我已经设置了代码,以便它可以收集字符组适用的所有规则,但是一旦确定,我不确定如何选择正确的音素。例如,我一直以“谨慎”一词为例。这个单词中的“ au”组合符合“ a”规则和“ o”规则。
这将产生笑声,或产生教导的o声。显然,如教中的o将是正确的答案,但是我如何才能对此进行代码检查?
如何确定在此处正确使用哪个音素?
这是我尚未使用的第二套规则起作用的地方吗?如果是这样,您如何建议使用这些规则来消除/缩小适用的规则?
我已经坐了一段时间了,我不是专业人士,但我想得到任何人的反馈。如果需要更多详细信息,请告诉我。这是到目前为止的代码:
var test01 = function(word)
{
var arr = [];
var arr2 = [];
//for every letter in the word
for(var x = 0; x < word.length; x ++)
{
//grab the letter
var index = word[x];
var pert = [];
//push the letter to an array
arr.push(index);
//create an object which holds the neighboring letters
var pro = new Object();
pro.left = word[x - 1];
pro.org = index;
pro.right = word[x + 1];
//store this object in an array
arr2.push(pro);
//check to see if any spaces exist (undefined) and replace them with a ""
for(b in pro)
{
if(!pro[b])
{
pro[b] = "";
}
}
//loop through each letter object
for(var y = 0; y < arr2.length; y ++)
{
var letter = arr2[y];
letter.rules = [];
//loop through each rule that exists
for (z in rules_syntax)
{
var rule = rules_syntax[z];
//for each rule, loop through its graphemes
for(var a = 0; a < rule.case.length; a ++)
{
var grapheme = rule.case[a];
//combine the original letter, and the letter to the left
var letterCheck = letter.left + letter.org;
//check if the above combo (left + original) exists in the list of graphemes
if(letterCheck === grapheme)
{
//here is where I would put any other conditions to check for any other rules.
pert.push(rule.pro);
letter.rules.push(rule.pro);
}
if(letter.org === grapheme)
{
//here is where I would put any other conditions to check for any other rules.
pert.push(rule.pro);
letter.rules.push(rule.pro);
}
}
}
}
console.log(pert);
}
}
test01("cautious");
这是输出的最后一行
(16) ["k", "k", "a", "o", "a", "o", "u", "t", "sh", "i", "y", "o", "u", "u", "s", "zh"]
任何回复都值得赞赏。
谢谢。
答案 0 :(得分:1)
我认为您从文章中误读了表2:
'#'一个或多个元音
'*'(星号)一个或多个辅音
'*'(圆圈)B,D,V,G,J,L,M,N,R,W和Z中的一个:有声 辅音
'$'一个辅音,后跟一个E或I
'%'(ER,E,ES,ED,ING,ELY)之一:后缀
'&'(S,C,G,Z,X,J,CH,SH)之一:助音剂
'@'(T,S,R,D,L,Z,N,J,TH,CH,SH)中的一个 影响随后的较长u的声音(参见规则和m子)
'^'一个辅音
'+'(E,I,Y)中的一个:前元音
':'零个或多个辅音
该表的标题显示:
英语到IPA的翻译规则中出现的特殊符号
换句话说,这些不是规则,而是对符号的描述。
真正的规则从文章的第51页开始。据我了解的算法,它将首先解析“ t”,然后转到TRULE.ENG部分(第58页)。唯一适用的规则是[T]=/T/
。然后,它解析“ a”,并查看ARULE.ENG(第51页)。扫描那里的规则,我发现适用的第一个规则是[AU]=/AO/
,它为您提供了“授课”中的“ au”。从那里转到GRULE.ENG列表,为“ gh”生成/ /
,然后为最终的“ t”再次生成/T/
。
至于“笑”,从规则上来说,我要说的是“教”中的“ au”。而且因为规则是#[GH]=/ /
,所以不会有其他声音。 “笑”可能听起来像“法律”。