itak 4 → 5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3f5c18bc3e593097a8a4efac8f78432ccf2db6b7771ba740dae975f12b0f12f3
4
- data.tar.gz: b8e1a1c9e26a8427116515243703e889171b6a5f49d4c42285a89b19b63749e9
3
+ metadata.gz: b561ff088fcc7f0280505863ba376e5d394c7cb470790141b0a799272b6db981
4
+ data.tar.gz: 761cb0d70df9bb1b9e9f6bee02b18540798639f054476221080f29fdb8595acd
5
5
  SHA512:
6
- metadata.gz: d8fc23e257aa870f7337ef05e6f930f96713402881c2f3290dececdbf2792522a1d8f9f4394e1e00f43108bd13c5498ee4e141409cee65f470dfcd28d9c01f03
7
- data.tar.gz: 45e7516e05441624c7871c900097f12472e450bf0d557e9a81e7ef0c0f8512f9cc5d59dad0a88d4090db3f31f36b3ba5fef1d32c53e8fffce4cb2cdd35b0c9ce
6
+ metadata.gz: 8ed97cece759284876c9dca21cc8077a9c1b9659d90ffd28953899d8f4565bbecb183999b115648a9fd554e58a0f5ecacaad1ddc686167d0a3bfa3a802634a7c
7
+ data.tar.gz: ab10d6c6bcb13ad0b29a1529447368364e92764d44943991de5f7a0fea77244ec1ff053d453648baa92aa9bb15be80f786d362d923e6de0ac72bb8174360480f
data/README.md CHANGED
@@ -56,7 +56,7 @@ Though Itak is intended to be used as CLI, it provides some useful classes for e
56
56
  * `waveform`: Multi-dimensional array containing the waveform. Currently, it is a `Torch::Tensor`
57
57
  * `sample_rate`: Sample rate
58
58
  * `layout`: Audio layout. `:interleaved` or `:planar`
59
- * `channels`: The number of channels
59
+ * `num_channels`: The number of channels
60
60
 
61
61
  *Note* that attributes are *not* kept consistent automatically. You are responsible for updating them when modifying the audio data:
62
62
 
@@ -65,6 +65,14 @@ audio.waveform = ...
65
65
  audio.sample_rate = ...
66
66
  ```
67
67
 
68
+ It has attribute-like methods, too:
69
+
70
+ * `num_frames`: The number of frames
71
+ * `duration`: Duration in seconds
72
+ * `mono?`: `true` when it's mono audio
73
+ * `interleaved?`: `true` when it's interleaved audio
74
+ * `planar?`: `true` when it's planar audio
75
+
68
76
  Also, it has methods to load and save audio:
69
77
 
70
78
  * `Audio.load(path)` loads audio from `path` and returns `Itak::Audio` instance.
data/itak.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "itak"
3
- s.version = "4"
3
+ s.version = "5"
4
4
  s.authors = ["Kitaiti Makoto"]
5
5
  s.email = ["KitaitiMaokto@gmail.com"]
6
6
  s.summary = "Audio editing tool for podcasters"
data/lib/itak/audio.rb CHANGED
@@ -19,18 +19,66 @@ class Itak
19
19
  @sample_rate = sample_rate
20
20
  @layout = layout
21
21
  @debug_info = debug_info
22
+
23
+ validate
22
24
  end
23
25
 
24
- def channels
26
+ def num_channels
25
27
  shape = @waveform.shape
26
28
  return 1 if shape.length == 1
27
29
 
28
- layout == :interleaved ? shape[-1] : shape[0]
30
+ interleaved? ? shape[-1] : shape[0]
31
+ end
32
+
33
+ def mono?
34
+ num_channels == 1
35
+ end
36
+
37
+ def num_frames
38
+ shape = @waveform.shape
39
+ return shape[0] if @waveform.ndim == 1
40
+
41
+ interleaved? ? shape[0] : shape[-1]
42
+ end
43
+
44
+ def duration
45
+ num_frames.to_f / @sample_rate
46
+ end
47
+
48
+ def interleaved?
49
+ @layout == :interleaved
50
+ end
51
+
52
+ def planar?
53
+ !interleaved?
29
54
  end
30
55
 
31
56
  def save(path)
32
57
  TorchAudio.save path.to_path, waveform, sample_rate
33
58
  self
34
59
  end
60
+
61
+ def inspect
62
+ str = "#<#{self.class}"
63
+ instance_variables.each do |iv|
64
+ if iv == :@waveform
65
+ str << " #{iv}=#{@waveform.class}(#{@waveform.shape})"
66
+ else
67
+ str << " #{iv}=#{instance_variable_get(iv).inspect}"
68
+ end
69
+ end
70
+ str << ">"
71
+ end
72
+
73
+ private
74
+
75
+ def validate
76
+ if @waveform.ndim > 2
77
+ raise ArgumentError, "Dimension of waveform must be 1 or 2, but #{waveform.ndim}"
78
+ end
79
+ unless [:interleaved, :planar].include? @layout
80
+ raise ArgumentError, "Layout must be :interleaved or :planar, but #{@layout.inspect}"
81
+ end
82
+ end
35
83
  end
36
84
  end
@@ -5,13 +5,13 @@ class Itak
5
5
  class NormalizeLoudness
6
6
  prepend Processible
7
7
 
8
- def initialize(target: -14.0, true_peak_ceiling: -0.1)
8
+ def initialize(target: -14.0, true_peak_ceiling: nil)
9
9
  @target = target
10
- @true_peak_ceiling= true_peak_ceiling
10
+ @true_peak_ceiling = true_peak_ceiling
11
11
  end
12
12
 
13
13
  def run(audio)
14
- channels = case audio.channels
14
+ channels = case audio.num_channels
15
15
  in 1
16
16
  [:center]
17
17
  in 2
@@ -10,7 +10,7 @@ class Itak
10
10
 
11
11
  def run(audio)
12
12
  samples = NumoNArray(audio.waveform)
13
- audio.waveform = Awaaz::Utils::Resample.read_and_resample(samples, audio.sample_rate, @to, audio.channels).to_ndav.to_torch_tensor
13
+ audio.waveform = Awaaz::Utils::Resample.read_and_resample(samples, audio.sample_rate, @to, audio.num_channels).to_ndav.to_torch_tensor
14
14
  audio.sample_rate = @to
15
15
  end
16
16
  end
@@ -22,8 +22,8 @@ class Itak
22
22
  chunks = []
23
23
  @vad.segments_from_samples(@params, src).each do |segment|
24
24
  segment => {start_time:, end_time:}
25
- st = start_time * SAMPLE_RATE / 1000
26
- en = end_time * SAMPLE_RATE / 1000
25
+ st = start_time * ML_SAMPLE_RATE / 1000
26
+ en = end_time * ML_SAMPLE_RATE / 1000
27
27
  chunks << src[st..en]
28
28
  end
29
29
  chunks.empty? ? src : Torch.cat(chunks)
data/lib/itak.rb CHANGED
@@ -12,7 +12,8 @@ class Itak
12
12
  include NDAV::Converter
13
13
  include Process
14
14
 
15
- SAMPLE_RATE = 16_000
15
+ ML_SAMPLE_RATE = 16_000
16
+ FINAL_SAMPLE_RATE = 44_1000
16
17
 
17
18
  def initialize(src, dest=nil)
18
19
  @src = Pathname(src)
@@ -33,11 +34,12 @@ class Itak
33
34
  Audio.load(@src, debug_info: {src: @src, dest: @dest})
34
35
  .(&NormalizeLoudness)
35
36
  .(&DownMix)
36
- .(&Resample[to: SAMPLE_RATE])
37
+ .(&Resample[to: ML_SAMPLE_RATE])
37
38
  .(&Denoise)
38
39
  .(&VAD)
39
- .>>(&Save[to: @dest])
40
40
  .>>(&Transcribe[dest: @transcription_dest])
41
+ .(&Resample[to: FINAL_SAMPLE_RATE])
42
+ .>>(&Save[to: @dest])
41
43
  .<<
42
44
 
43
45
  [@dest, @transcription_dest]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: itak
3
3
  version: !ruby/object:Gem::Version
4
- version: '4'
4
+ version: '5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kitaiti Makoto