如何将 .wav 格式的声音相互附加
Posted
技术标签:
【中文标题】如何将 .wav 格式的声音相互附加【英文标题】:How to append .wav format sounds to each other 【发布时间】:2012-07-16 09:07:51 【问题描述】:我正在通过阅读一些书籍和观看一些教程来自学 C#。所以,我决定同时做一个小项目,以获得更多的经验和巩固我的知识。我正在尝试用格鲁吉亚语(我的语言)创建一个文本到语音程序。我在java中做过同样的程序,但想用C#来传输它,但我不明白如何将不同的声音相互附加。例如,当我的程序想要说一个词“general”时,它会将这个词分成像这样的部分 "ge"-first "ne"-second "ra"-second "l"-second (这些 first 和 second 表示该部分在单词的第一部分,我这样做是因为 ge-first 和 ge -second 有不同的语调)所以,我以 .wav 格式记录了这些部分,并希望程序附加它们并创建一个单词。我在 MSDN.COM 上寻找课程并找到了 SoundPlayer,但我不知道如何将 WAV 格式的声音相互附加。我想将一种声音添加到另一种声音并播放一个新声音,例如我有一个声音说“aaa”而另一个声音说“bbbb”我想要一个声音说“aaabbbb”。
为了划分单词,我创建了一个数组列表并使用了这段代码。
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,但不知道该怎么做,所以请帮助我:) 我应该使用什么方法以及如何使用?
【问题讨论】:
【参考方案1】:这里有很好的帮助链接:
Concatenating Wave Files Using C# 2005 C# WAV file class, audio mixing, and some light audio manipulation也许这个:Merge WAV files in C#
【讨论】:
以上是关于如何将 .wav 格式的声音相互附加的主要内容,如果未能解决你的问题,请参考以下文章