DecodeFile.cs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright (c) 2023 Xiaomi Corporation (authors: Fangjun Kuang)
  2. using System;
  3. class DecodeFile
  4. {
  5. public static void Main(String[] args)
  6. {
  7. String usage = @"
  8. ./DecodeFile.exe \
  9. /path/to/tokens.txt \
  10. /path/to/encoder.ncnn.param \
  11. /path/to/encoder.ncnn.bin \
  12. /path/to/decoder.ncnn.param \
  13. /path/to/decoder.ncnn.bin \
  14. /path/to/joiner.ncnn.param \
  15. /path/to/joiner.ncnn.bin \
  16. /path/to/foo.wav [<num_threads> [decode_method]]
  17. num_threads: Default to 1
  18. decoding_method: greedy_search (default), or modified_beam_search
  19. Please refer to
  20. https://k2-fsa.github.io/sherpa/ncnn/pretrained_models/index.html
  21. for a list of pre-trained models to download.
  22. ";
  23. if (args.Length < 8 || args.Length > 10)
  24. {
  25. Console.WriteLine(usage);
  26. return;
  27. }
  28. String waveFilename = args[7];
  29. SherpaNcnn.WaveReader waveReader = new SherpaNcnn.WaveReader(waveFilename);
  30. SherpaNcnn.OnlineRecognizerConfig config = new SherpaNcnn.OnlineRecognizerConfig();
  31. config.FeatConfig.SampleRate = 16000;
  32. config.FeatConfig.FeatureDim = 80;
  33. config.ModelConfig.Tokens = args[0];
  34. config.ModelConfig.EncoderParam = args[1];
  35. config.ModelConfig.EncoderBin = args[2];
  36. config.ModelConfig.DecoderParam = args[3];
  37. config.ModelConfig.DecoderBin = args[4];
  38. config.ModelConfig.JoinerParam = args[5];
  39. config.ModelConfig.JoinerBin = args[6];
  40. config.ModelConfig.UseVulkanCompute = 0;
  41. config.ModelConfig.NumThreads = 1;
  42. if (args.Length >= 9)
  43. {
  44. config.ModelConfig.NumThreads = Int32.Parse(args[8]);
  45. if (config.ModelConfig.NumThreads > 1)
  46. {
  47. Console.WriteLine($"Use num_threads: {config.ModelConfig.NumThreads}");
  48. }
  49. }
  50. config.DecoderConfig.DecodingMethod = "greedy_search";
  51. if (args.Length == 10 && args[9] != "greedy_search")
  52. {
  53. Console.WriteLine($"Use decoding_method {args[9]}");
  54. config.DecoderConfig.DecodingMethod = args[9];
  55. }
  56. config.DecoderConfig.NumActivePaths = 4;
  57. SherpaNcnn.OnlineRecognizer recognizer = new SherpaNcnn.OnlineRecognizer(config);
  58. SherpaNcnn.OnlineStream stream = recognizer.CreateStream();
  59. stream.AcceptWaveform(waveReader.SampleRate, waveReader.Samples);
  60. float[] tailPadding = new float[(int)(waveReader.SampleRate * 0.3)];
  61. stream.AcceptWaveform(waveReader.SampleRate, tailPadding);
  62. stream.InputFinished();
  63. while (recognizer.IsReady(stream))
  64. {
  65. recognizer.Decode(stream);
  66. }
  67. SherpaNcnn.OnlineRecognizerResult result = recognizer.GetResult(stream);
  68. Console.WriteLine(result.Text);
  69. }
  70. }