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 +4 -4
- data/README.md +9 -1
- data/itak.gemspec +1 -1
- data/lib/itak/audio.rb +50 -2
- data/lib/itak/process/normalize_loudness.rb +3 -3
- data/lib/itak/process/resample.rb +1 -1
- data/lib/itak/process/vad.rb +2 -2
- data/lib/itak.rb +5 -3
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b561ff088fcc7f0280505863ba376e5d394c7cb470790141b0a799272b6db981
|
|
4
|
+
data.tar.gz: 761cb0d70df9bb1b9e9f6bee02b18540798639f054476221080f29fdb8595acd
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
* `
|
|
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
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
|
|
26
|
+
def num_channels
|
|
25
27
|
shape = @waveform.shape
|
|
26
28
|
return 1 if shape.length == 1
|
|
27
29
|
|
|
28
|
-
|
|
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:
|
|
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.
|
|
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.
|
|
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
|
data/lib/itak/process/vad.rb
CHANGED
|
@@ -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 *
|
|
26
|
-
en = end_time *
|
|
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
|
-
|
|
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:
|
|
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]
|