我正在通过阅读一些书籍和观看一些教程自学C#。所以,我决定同时做一个小项目,以获得更多的经验,强化我的知识。我正在尝试用格鲁吉亚语(我的语言)创建一个文本到语音的程序。我用java做过同样的程序,但想用C#传输,但我不明白如何将不同的声音相互附加。例如,当我的程序想说一个单词"general"时,它会把这个单词分成这样的部分:"ge"-第一个"ne"-第二个"ra"-第三个"l"-第四个(第一个和第二个意味着这个部分在单词的第一部分,我这样做是因为ge first和ge second有不同的发音),所以我用.wav格式记录了这些部分,并希望程序将它们附加起来并创建一个单词。我在MSDN.COM上查找类,找到了SoundPlayer,但我不知道如何将WAV格式的声音相互附加。我想把一个声音添加到另一个声音中,然后播放一个新的声音,例如,我有一个声音说"aaa",另一个说"bbbb",我想得到一个声音,说"aabbbb"。
为了划分单词,我创建了一个数组列表并使用了这个代码。
public ArrayList divide(String s) //დაყოფა და arraylist-ში გადანაწილება
{
ArrayList a = new ArrayList();
int i = 0;
while (i < s.Length)
{
if (s[i] == ',' || s[i] == ' ' || s[i] == '.')
{
a.Add(s.Substring(i, i + 1));
i++;
continue;
}
if (consonant(s[i]) && (i + 1) != s.Length && sonant(s[i + 1]))
{
if (isFirstSonant(s, i))
a.Add(s.Substring(i, i + 2) + "_FIRST");
else
a.Add(s.Substring(i, i + 2) + "_SECOND");
i += 2;
continue;
}
if (sonant(s[i]) && ((i + 1) < s.Length && sonant(s[i]) || i == (s.Length - 1)))
{
if (isFirstSonant(s, i))
a.Add(s.Substring(i, i + 1) + "_FIRST");
else
a.Add(s.Substring(i, i + 1) + "_SECOND");
i++;
continue;
}
if (consonant(s[i]) && ((i + 1) < s.Length && consonant(s[i]) || i == (s.Length - 1)))
{
a.Add(s.Substring(i, i + 1) + "_SECOND");
i++;
continue;
}
}
return a;
}
我在java程序中使用了相同的代码(当然是java语法),但在尝试处理.wav文件时遇到了问题,我不知道该使用哪种方法以及如何粘贴这些声音。这就是我在java上的做法。
public AudioInputStream find(String s) throws UnsupportedAudioFileException, IOException {
return AudioSystem.getAudioInputStream(
new File("C:/Users/Vato/Desktop/Programing/sintezatori/alphabet/"+s+".wav"));
}
public AudioInputStream append(AudioInputStream main, String s) throws UnsupportedAudioFileException, IOException {
return new AudioInputStream(
new SequenceInputStream(main, find(s)),
main.getFormat(),
main.getFrameLength() + find(s).getFrameLength());
}
private String s;
public void Process() {
try {
AudioInputStream main = AudioSystem.getAudioInputStream(new File("C:/Users/Vato/Desktop/Programing/sintezatori/alphabet/blank.wav"));
ArrayList<String> aa = divide(s);
for(int ii=0;ii<aa.size();ii++) {
main=append(main, aa.get(ii));
System.out.println(aa.get(ii));
}
AudioSystem.write(main, AudioFileFormat.Type.WAVE, new File("C:/Users/Vato/Desktop/Programing/sintezatori/alphabet/result.wav"));
result=main;
AudioInputStream result1 = AudioSystem.getAudioInputStream(new File("C:/Users/Vato/Desktop/Programing/sintezatori/alphabet/result.wav"));
DataLine.Info info =
new DataLine.Info(Clip.class,
result1.getFormat());
Clip clip = (Clip) AudioSystem.getLine(info);
clip.open(result1);
clip.start();
} catch (Exception e) {
e.printStackTrace();
}
}
private AudioInputStream result;
public AudioInputStream getResult() {
return result;
}
现在我想在C#上做几乎相同的事情。我看了这一页http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx但不知道该怎么办,所以请帮帮我:)我应该使用什么方法以及如何使用?
这里有很好的链接可以帮助:
- 使用C#2005连接波形文件
- C#WAV文件类、音频混合和一些轻音频操作
也许是这样:合并C#中的WAV文件