2012-07-15 70 views
1

我正在通過閱讀一些書籍和看一些教程來自學C#。所以,我決定同時做一個小型項目,以獲得更多的經驗,並鞏固我的知識。我正嘗試在格魯吉亞語(我的語言)中創建一個語音轉換程序,但是我無法理解如何在不同的聲音之間添加不同的聲音。例如,當我的程序想要說「語言」時,它會將單詞分成「la」,「n」,「gu」,「a」,「ge」,所以我記錄了這些部分並且想要附加它們並創建一個單詞。我在MSDN.COM上找到了一些類,發現了SoundPlayer,但是,我無法弄清楚如何附加WAV格式的聲音。我想添加一個聲音到另一個,並播放一個新的,例如我有聲音說「aaa」,另一個說「bbbb」我想得到一個聲音,說「aaabbbb」。如何在C中添加聲音#

要劃分單詞我創建一個arraylist並使用此代碼。

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上製作了這個程序,並且想在C#上做同樣的事情,所以這是我在java上的代碼。 這就是我以後如何追加聲音,把它們放入數組列表中。

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; 
} 

我應該從這些http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx使用哪種方法或類?我怎樣才能在C#中做同樣的事情?

+0

我創建了一個新的問題,使人們瞭解我真正想要的。對不起這個不好的問題,我想刪除它,但不能。如果你想更好地看到這個問題只是去這個鏈接http://stackoverflow.com/questions/11501160/how-to-append-wav-format-sounds-to-each-other-in-c-sharp 。謝謝:) – vato 2012-07-16 09:10:57

回答

1

聲音播放器應該工作:

using System.Media; 

InitializeComponent(); 
Soundplayer MySounds = new SoundPlayer(@"C:\example.wav); 
MySounds.Play(); 
+0

是的,我做到了,但是,我想添加一個聲音到另一個,並播放一個新的,例如我有聲音說「aaa」,另一個說「bbbb」我想得到一個聲音說「 aaabbbb「 – vato 2012-07-15 17:09:53

2

如果你不希望使用現有的SDK,你可以這樣做以下:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using System.Media; 
using System.Text; 

namespace ConsoleApplication3 
{ 
    public class SpeechClass 
    { 

     private Dictionary<char, string> _letterToFileMapping = new Dictionary<char, string>(); 
     private string _basePath = "\\soundfiles"; 


     public SpeechClass() 
     { 
      PopulateMappings(); 
     } 


     private void PopulateMappings() 
     { 
      _letterToFileMapping.Add('a', "asound.wav"); 
      _letterToFileMapping.Add('b', "bsound.wav"); 
      _letterToFileMapping.Add('c', "csound.wav"); 
      _letterToFileMapping.Add('d', "dsound.wav"); 
     } 

     private void SayWord(string word) 
     { 
      var chars = word.ToCharArray(); 

      List<string> filestosay = new List<string>(); 

      foreach (var c in chars) 
      { 
       string sound; 
       if(_letterToFileMapping.TryGetValue(c, out sound)) 
       { 
        filestosay.Add(sound); 
       } 
      } 

      foreach (string s in filestosay) 
      { 
       SoundPlayer p = new SoundPlayer(); 
       p.SoundLocation = Path.Combine(_basePath, s); 
       p.Play(); 

      } 
     } 
    } 
} 
+0

非常感謝:) – vato 2012-07-15 17:19:30

+0

請注意,這並沒有優化。您可以將聲音播放器移到foreach循環之外,這樣您就不會每次都花費初始化新對象的代價。 – tsells 2012-07-15 17:19:54

+0

哦,你是對的:)我會把它拿出來。 – vato 2012-07-15 17:28:58