whispercpp 1.3.0 → 1.3.1

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.
Files changed (132) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/LICENSE +1 -1
  4. data/README.md +165 -434
  5. data/Rakefile +60 -11
  6. data/ext/.gitignore +13 -0
  7. data/ext/cpu.mk +9 -0
  8. data/ext/{dr_wav.h → examples/dr_wav.h} +3560 -1179
  9. data/ext/extconf.rb +185 -16
  10. data/ext/ggml/include/ggml-alloc.h +76 -0
  11. data/ext/ggml/include/ggml-backend.h +352 -0
  12. data/ext/ggml/include/ggml-blas.h +25 -0
  13. data/ext/ggml/include/ggml-cann.h +123 -0
  14. data/ext/ggml/include/ggml-cpp.h +38 -0
  15. data/ext/ggml/include/ggml-cpu.h +135 -0
  16. data/ext/ggml/include/ggml-cuda.h +47 -0
  17. data/ext/ggml/include/ggml-kompute.h +50 -0
  18. data/ext/ggml/include/ggml-metal.h +66 -0
  19. data/ext/ggml/include/ggml-opencl.h +26 -0
  20. data/ext/ggml/include/ggml-opt.h +216 -0
  21. data/ext/ggml/include/ggml-rpc.h +28 -0
  22. data/ext/ggml/include/ggml-sycl.h +49 -0
  23. data/ext/ggml/include/ggml-vulkan.h +31 -0
  24. data/ext/{ggml.h → ggml/include/ggml.h} +479 -596
  25. data/ext/ggml/src/ggml-alloc.c +1037 -0
  26. data/ext/ggml/src/ggml-amx/common.h +94 -0
  27. data/ext/ggml/src/ggml-amx/ggml-amx.cpp +446 -0
  28. data/ext/ggml/src/ggml-amx/mmq.cpp +2510 -0
  29. data/ext/ggml/src/ggml-amx/mmq.h +17 -0
  30. data/ext/ggml/src/ggml-backend-impl.h +256 -0
  31. data/ext/ggml/src/ggml-backend-reg.cpp +552 -0
  32. data/ext/ggml/src/ggml-backend.cpp +1999 -0
  33. data/ext/ggml/src/ggml-blas/ggml-blas.cpp +517 -0
  34. data/ext/ggml/src/ggml-cann/acl_tensor.cpp +175 -0
  35. data/ext/ggml/src/ggml-cann/acl_tensor.h +258 -0
  36. data/ext/ggml/src/ggml-cann/aclnn_ops.cpp +3427 -0
  37. data/ext/ggml/src/ggml-cann/aclnn_ops.h +592 -0
  38. data/ext/ggml/src/ggml-cann/common.h +286 -0
  39. data/ext/ggml/src/ggml-cann/ggml-cann.cpp +2188 -0
  40. data/ext/ggml/src/ggml-cann/kernels/ascendc_kernels.h +19 -0
  41. data/ext/ggml/src/ggml-cann/kernels/dup.cpp +236 -0
  42. data/ext/ggml/src/ggml-cann/kernels/get_row_f16.cpp +197 -0
  43. data/ext/ggml/src/ggml-cann/kernels/get_row_f32.cpp +190 -0
  44. data/ext/ggml/src/ggml-cann/kernels/get_row_q4_0.cpp +204 -0
  45. data/ext/ggml/src/ggml-cann/kernels/get_row_q8_0.cpp +191 -0
  46. data/ext/ggml/src/ggml-cann/kernels/quantize_f16_q8_0.cpp +218 -0
  47. data/ext/ggml/src/ggml-cann/kernels/quantize_f32_q8_0.cpp +216 -0
  48. data/ext/ggml/src/ggml-cann/kernels/quantize_float_to_q4_0.cpp +295 -0
  49. data/ext/ggml/src/ggml-common.h +1853 -0
  50. data/ext/ggml/src/ggml-cpu/amx/amx.cpp +220 -0
  51. data/ext/ggml/src/ggml-cpu/amx/amx.h +8 -0
  52. data/ext/ggml/src/ggml-cpu/amx/common.h +91 -0
  53. data/ext/ggml/src/ggml-cpu/amx/mmq.cpp +2511 -0
  54. data/ext/ggml/src/ggml-cpu/amx/mmq.h +10 -0
  55. data/ext/ggml/src/ggml-cpu/cpu-feats-x86.cpp +323 -0
  56. data/ext/ggml/src/ggml-cpu/ggml-cpu-aarch64.cpp +4262 -0
  57. data/ext/ggml/src/ggml-cpu/ggml-cpu-aarch64.h +8 -0
  58. data/ext/ggml/src/ggml-cpu/ggml-cpu-hbm.cpp +55 -0
  59. data/ext/ggml/src/ggml-cpu/ggml-cpu-hbm.h +8 -0
  60. data/ext/ggml/src/ggml-cpu/ggml-cpu-impl.h +386 -0
  61. data/ext/ggml/src/ggml-cpu/ggml-cpu-quants.c +10835 -0
  62. data/ext/ggml/src/ggml-cpu/ggml-cpu-quants.h +63 -0
  63. data/ext/ggml/src/ggml-cpu/ggml-cpu-traits.cpp +36 -0
  64. data/ext/ggml/src/ggml-cpu/ggml-cpu-traits.h +38 -0
  65. data/ext/ggml/src/ggml-cpu/ggml-cpu.c +14123 -0
  66. data/ext/ggml/src/ggml-cpu/ggml-cpu.cpp +622 -0
  67. data/ext/ggml/src/ggml-cpu/llamafile/sgemm.cpp +1884 -0
  68. data/ext/ggml/src/ggml-cpu/llamafile/sgemm.h +14 -0
  69. data/ext/ggml/src/ggml-cuda/vendors/cuda.h +14 -0
  70. data/ext/ggml/src/ggml-cuda/vendors/hip.h +186 -0
  71. data/ext/ggml/src/ggml-cuda/vendors/musa.h +134 -0
  72. data/ext/ggml/src/ggml-impl.h +556 -0
  73. data/ext/ggml/src/ggml-kompute/ggml-kompute.cpp +2251 -0
  74. data/ext/ggml/src/ggml-metal/ggml-metal-impl.h +288 -0
  75. data/ext/ggml/src/ggml-metal/ggml-metal.m +4884 -0
  76. data/ext/ggml/src/ggml-metal/ggml-metal.metal +6732 -0
  77. data/ext/ggml/src/ggml-opt.cpp +854 -0
  78. data/ext/ggml/src/ggml-quants.c +5238 -0
  79. data/ext/ggml/src/ggml-quants.h +100 -0
  80. data/ext/ggml/src/ggml-rpc/ggml-rpc.cpp +1406 -0
  81. data/ext/ggml/src/ggml-sycl/common.cpp +95 -0
  82. data/ext/ggml/src/ggml-sycl/concat.cpp +196 -0
  83. data/ext/ggml/src/ggml-sycl/conv.cpp +99 -0
  84. data/ext/ggml/src/ggml-sycl/convert.cpp +547 -0
  85. data/ext/ggml/src/ggml-sycl/dmmv.cpp +1023 -0
  86. data/ext/ggml/src/ggml-sycl/element_wise.cpp +1030 -0
  87. data/ext/ggml/src/ggml-sycl/ggml-sycl.cpp +4729 -0
  88. data/ext/ggml/src/ggml-sycl/im2col.cpp +126 -0
  89. data/ext/ggml/src/ggml-sycl/mmq.cpp +3031 -0
  90. data/ext/ggml/src/ggml-sycl/mmvq.cpp +1015 -0
  91. data/ext/ggml/src/ggml-sycl/norm.cpp +378 -0
  92. data/ext/ggml/src/ggml-sycl/outprod.cpp +56 -0
  93. data/ext/ggml/src/ggml-sycl/rope.cpp +276 -0
  94. data/ext/ggml/src/ggml-sycl/softmax.cpp +251 -0
  95. data/ext/ggml/src/ggml-sycl/tsembd.cpp +72 -0
  96. data/ext/ggml/src/ggml-sycl/wkv6.cpp +141 -0
  97. data/ext/ggml/src/ggml-threading.cpp +12 -0
  98. data/ext/ggml/src/ggml-threading.h +14 -0
  99. data/ext/ggml/src/ggml-vulkan/ggml-vulkan.cpp +8657 -0
  100. data/ext/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +593 -0
  101. data/ext/ggml/src/ggml.c +7694 -0
  102. data/ext/{whisper.h → include/whisper.h} +23 -22
  103. data/ext/metal-embed.mk +17 -0
  104. data/ext/metal.mk +6 -0
  105. data/ext/ruby_whisper.cpp +1492 -9
  106. data/ext/ruby_whisper.h +10 -0
  107. data/ext/scripts/get-flags.mk +38 -0
  108. data/ext/src/coreml/whisper-decoder-impl.h +146 -0
  109. data/ext/src/coreml/whisper-decoder-impl.m +201 -0
  110. data/ext/src/coreml/whisper-encoder-impl.h +142 -0
  111. data/ext/src/coreml/whisper-encoder-impl.m +197 -0
  112. data/ext/src/coreml/whisper-encoder.h +26 -0
  113. data/ext/src/openvino/whisper-openvino-encoder.cpp +108 -0
  114. data/ext/src/openvino/whisper-openvino-encoder.h +31 -0
  115. data/ext/{whisper.cpp → src/whisper.cpp} +661 -492
  116. data/extsources.rb +6 -0
  117. data/lib/whisper/model/uri.rb +157 -0
  118. data/lib/whisper.rb +2 -0
  119. data/tests/helper.rb +7 -0
  120. data/tests/jfk_reader/.gitignore +5 -0
  121. data/tests/jfk_reader/extconf.rb +3 -0
  122. data/tests/jfk_reader/jfk_reader.c +68 -0
  123. data/tests/test_callback.rb +160 -0
  124. data/tests/test_error.rb +20 -0
  125. data/tests/test_model.rb +71 -0
  126. data/tests/test_package.rb +31 -0
  127. data/tests/test_params.rb +160 -0
  128. data/tests/test_segment.rb +83 -0
  129. data/tests/test_whisper.rb +211 -123
  130. data/whispercpp.gemspec +36 -0
  131. metadata +137 -11
  132. data/ext/ggml.c +0 -21755
@@ -0,0 +1,83 @@
1
+ require_relative "helper"
2
+
3
+ class TestSegment < TestBase
4
+ class << self
5
+ attr_reader :whisper
6
+
7
+ def startup
8
+ @whisper = Whisper::Context.new("base.en")
9
+ params = Whisper::Params.new
10
+ params.print_timestamps = false
11
+ @whisper.transcribe(TestBase::AUDIO, params)
12
+ end
13
+ end
14
+
15
+ def test_iteration
16
+ whisper.each_segment do |segment|
17
+ assert_instance_of Whisper::Segment, segment
18
+ end
19
+ end
20
+
21
+ def test_enumerator
22
+ enum = whisper.each_segment
23
+ assert_instance_of Enumerator, enum
24
+ enum.to_a.each_with_index do |segment, index|
25
+ assert_instance_of Whisper::Segment, segment
26
+ assert_kind_of Integer, index
27
+ end
28
+ end
29
+
30
+ def test_start_time
31
+ i = 0
32
+ whisper.each_segment do |segment|
33
+ assert_equal 0, segment.start_time if i == 0
34
+ i += 1
35
+ end
36
+ end
37
+
38
+ def test_end_time
39
+ i = 0
40
+ whisper.each_segment do |segment|
41
+ assert_equal whisper.full_get_segment_t1(i) * 10, segment.end_time
42
+ i += 1
43
+ end
44
+ end
45
+
46
+ def test_on_new_segment
47
+ params = Whisper::Params.new
48
+ seg = nil
49
+ index = 0
50
+ params.on_new_segment do |segment|
51
+ assert_instance_of Whisper::Segment, segment
52
+ if index == 0
53
+ seg = segment
54
+ assert_equal 0, segment.start_time
55
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, segment.text
56
+ end
57
+ index += 1
58
+ end
59
+ whisper.transcribe(AUDIO, params)
60
+ assert_equal 0, seg.start_time
61
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, seg.text
62
+ end
63
+
64
+ def test_on_new_segment_twice
65
+ params = Whisper::Params.new
66
+ seg = nil
67
+ params.on_new_segment do |segment|
68
+ seg = segment
69
+ return
70
+ end
71
+ params.on_new_segment do |segment|
72
+ assert_same seg, segment
73
+ return
74
+ end
75
+ whisper.transcribe(AUDIO, params)
76
+ end
77
+
78
+ private
79
+
80
+ def whisper
81
+ self.class.whisper
82
+ end
83
+ end
@@ -1,138 +1,226 @@
1
- TOPDIR = File.expand_path(File.join(File.dirname(__FILE__), '..'))
2
- EXTDIR = File.join(TOPDIR, 'ext')
3
- #$LIBDIR = File.join(TOPDIR, 'lib')
4
- #$:.unshift(LIBDIR)
5
- $:.unshift(EXTDIR)
1
+ require_relative "helper"
2
+ require "stringio"
3
+ require "etc"
6
4
 
7
- require 'whisper'
8
- require 'test/unit'
5
+ # Exists to detect memory-related bug
6
+ Whisper.log_set ->(level, buffer, user_data) {}, nil
9
7
 
10
- class TestWhisper < Test::Unit::TestCase
8
+ class TestWhisper < TestBase
11
9
  def setup
12
10
  @params = Whisper::Params.new
13
11
  end
14
12
 
15
- def test_language
16
- @params.language = "en"
17
- assert_equal @params.language, "en"
18
- @params.language = "auto"
19
- assert_equal @params.language, "auto"
20
- end
21
-
22
- def test_offset
23
- @params.offset = 10_000
24
- assert_equal @params.offset, 10_000
25
- @params.offset = 0
26
- assert_equal @params.offset, 0
27
- end
28
-
29
- def test_duration
30
- @params.duration = 60_000
31
- assert_equal @params.duration, 60_000
32
- @params.duration = 0
33
- assert_equal @params.duration, 0
34
- end
35
-
36
- def test_max_text_tokens
37
- @params.max_text_tokens = 300
38
- assert_equal @params.max_text_tokens, 300
39
- @params.max_text_tokens = 0
40
- assert_equal @params.max_text_tokens, 0
41
- end
42
-
43
- def test_translate
44
- @params.translate = true
45
- assert @params.translate
46
- @params.translate = false
47
- assert !@params.translate
48
- end
49
-
50
- def test_no_context
51
- @params.no_context = true
52
- assert @params.no_context
53
- @params.no_context = false
54
- assert !@params.no_context
55
- end
56
-
57
- def test_single_segment
58
- @params.single_segment = true
59
- assert @params.single_segment
60
- @params.single_segment = false
61
- assert !@params.single_segment
62
- end
63
-
64
- def test_print_special
65
- @params.print_special = true
66
- assert @params.print_special
67
- @params.print_special = false
68
- assert !@params.print_special
69
- end
70
-
71
- def test_print_progress
72
- @params.print_progress = true
73
- assert @params.print_progress
74
- @params.print_progress = false
75
- assert !@params.print_progress
76
- end
77
-
78
- def test_print_realtime
79
- @params.print_realtime = true
80
- assert @params.print_realtime
81
- @params.print_realtime = false
82
- assert !@params.print_realtime
83
- end
84
-
85
- def test_print_timestamps
86
- @params.print_timestamps = true
87
- assert @params.print_timestamps
88
- @params.print_timestamps = false
89
- assert !@params.print_timestamps
90
- end
91
-
92
- def test_suppress_blank
93
- @params.suppress_blank = true
94
- assert @params.suppress_blank
95
- @params.suppress_blank = false
96
- assert !@params.suppress_blank
97
- end
98
-
99
- def test_suppress_non_speech_tokens
100
- @params.suppress_non_speech_tokens = true
101
- assert @params.suppress_non_speech_tokens
102
- @params.suppress_non_speech_tokens = false
103
- assert !@params.suppress_non_speech_tokens
104
- end
105
-
106
- def test_token_timestamps
107
- @params.token_timestamps = true
108
- assert @params.token_timestamps
109
- @params.token_timestamps = false
110
- assert !@params.token_timestamps
111
- end
112
-
113
- def test_split_on_word
114
- @params.split_on_word = true
115
- assert @params.split_on_word
116
- @params.split_on_word = false
117
- assert !@params.split_on_word
118
- end
119
-
120
- def test_speed_up
121
- @params.speed_up = true
122
- assert @params.speed_up
123
- @params.speed_up = false
124
- assert !@params.speed_up
125
- end
126
-
127
13
  def test_whisper
128
- @whisper = Whisper::Context.new(File.join(TOPDIR, '..', '..', 'models', 'ggml-base.en.bin'))
14
+ @whisper = Whisper::Context.new("base.en")
129
15
  params = Whisper::Params.new
130
16
  params.print_timestamps = false
131
17
 
132
- jfk = File.join(TOPDIR, '..', '..', 'samples', 'jfk.wav')
133
- @whisper.transcribe(jfk, params) {|text|
18
+ @whisper.transcribe(AUDIO, params) {|text|
134
19
  assert_match /ask not what your country can do for you, ask what you can do for your country/, text
135
20
  }
136
21
  end
137
22
 
23
+ sub_test_case "After transcription" do
24
+ class << self
25
+ attr_reader :whisper
26
+
27
+ def startup
28
+ @whisper = Whisper::Context.new("base.en")
29
+ params = Whisper::Params.new
30
+ params.print_timestamps = false
31
+ @whisper.transcribe(TestBase::AUDIO, params)
32
+ end
33
+ end
34
+
35
+ def whisper
36
+ self.class.whisper
37
+ end
38
+
39
+ def test_full_n_segments
40
+ assert_equal 1, whisper.full_n_segments
41
+ end
42
+
43
+ def test_full_lang_id
44
+ assert_equal 0, whisper.full_lang_id
45
+ end
46
+
47
+ def test_full_get_segment_t0
48
+ assert_equal 0, whisper.full_get_segment_t0(0)
49
+ assert_raise IndexError do
50
+ whisper.full_get_segment_t0(whisper.full_n_segments)
51
+ end
52
+ assert_raise IndexError do
53
+ whisper.full_get_segment_t0(-1)
54
+ end
55
+ end
56
+
57
+ def test_full_get_segment_t1
58
+ t1 = whisper.full_get_segment_t1(0)
59
+ assert_kind_of Integer, t1
60
+ assert t1 > 0
61
+ assert_raise IndexError do
62
+ whisper.full_get_segment_t1(whisper.full_n_segments)
63
+ end
64
+ end
65
+
66
+ def test_full_get_segment_speaker_turn_next
67
+ assert_false whisper.full_get_segment_speaker_turn_next(0)
68
+ end
69
+
70
+ def test_full_get_segment_text
71
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, whisper.full_get_segment_text(0)
72
+ end
73
+ end
74
+
75
+ def test_lang_max_id
76
+ assert_kind_of Integer, Whisper.lang_max_id
77
+ end
78
+
79
+ def test_lang_id
80
+ assert_equal 0, Whisper.lang_id("en")
81
+ assert_raise ArgumentError do
82
+ Whisper.lang_id("non existing language")
83
+ end
84
+ end
85
+
86
+ def test_lang_str
87
+ assert_equal "en", Whisper.lang_str(0)
88
+ assert_raise IndexError do
89
+ Whisper.lang_str(Whisper.lang_max_id + 1)
90
+ end
91
+ end
92
+
93
+ def test_lang_str_full
94
+ assert_equal "english", Whisper.lang_str_full(0)
95
+ assert_raise IndexError do
96
+ Whisper.lang_str_full(Whisper.lang_max_id + 1)
97
+ end
98
+ end
99
+
100
+ def test_log_set
101
+ user_data = Object.new
102
+ logs = []
103
+ log_callback = ->(level, buffer, udata) {
104
+ logs << [level, buffer, udata]
105
+ }
106
+ Whisper.log_set log_callback, user_data
107
+ Whisper::Context.new("base.en")
108
+
109
+ assert logs.length > 30
110
+ logs.each do |log|
111
+ assert_include [Whisper::LOG_LEVEL_DEBUG, Whisper::LOG_LEVEL_INFO, Whisper::LOG_LEVEL_WARN], log[0]
112
+ assert_same user_data, log[2]
113
+ end
114
+ end
115
+
116
+ def test_log_suppress
117
+ stderr = $stderr
118
+ Whisper.log_set ->(level, buffer, user_data) {
119
+ # do nothing
120
+ }, nil
121
+ dev = StringIO.new("")
122
+ $stderr = dev
123
+ Whisper::Context.new("base.en")
124
+ assert_empty dev.string
125
+ ensure
126
+ $stderr = stderr
127
+ end
128
+
129
+ sub_test_case "full" do
130
+ def setup
131
+ super
132
+ @whisper = Whisper::Context.new("base.en")
133
+ @samples = File.read(AUDIO, nil, 78).unpack("s<*").collect {|i| i.to_f / 2**15}
134
+ end
135
+
136
+ def test_full
137
+ @whisper.full(@params, @samples, @samples.length)
138
+
139
+ assert_equal 1, @whisper.full_n_segments
140
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, @whisper.each_segment.first.text
141
+ end
142
+
143
+ def test_full_without_length
144
+ @whisper.full(@params, @samples)
145
+
146
+ assert_equal 1, @whisper.full_n_segments
147
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, @whisper.each_segment.first.text
148
+ end
149
+
150
+ def test_full_enumerator
151
+ samples = @samples.each
152
+ @whisper.full(@params, samples, @samples.length)
153
+
154
+ assert_equal 1, @whisper.full_n_segments
155
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, @whisper.each_segment.first.text
156
+ end
157
+
158
+ def test_full_enumerator_without_length
159
+ samples = @samples.each
160
+ assert_raise ArgumentError do
161
+ @whisper.full(@params, samples)
162
+ end
163
+ end
164
+
165
+ def test_full_enumerator_with_too_large_length
166
+ samples = @samples.each.take(10).to_enum
167
+ assert_raise StopIteration do
168
+ @whisper.full(@params, samples, 11)
169
+ end
170
+ end
171
+
172
+ def test_full_with_memory_view
173
+ samples = JFKReader.new(AUDIO)
174
+ @whisper.full(@params, samples)
175
+
176
+ assert_equal 1, @whisper.full_n_segments
177
+ assert_match /ask not what your country can do for you, ask what you can do for your country/, @whisper.each_segment.first.text
178
+ end
179
+
180
+ def test_full_parallel
181
+ @whisper.full_parallel(@params, @samples, @samples.length, Etc.nprocessors)
182
+
183
+ assert_equal Etc.nprocessors, @whisper.full_n_segments
184
+ text = @whisper.each_segment.collect(&:text).join
185
+ assert_match /ask what you can do/i, text
186
+ assert_match /for your country/i, text
187
+ end
188
+
189
+ def test_full_parallel_with_memory_view
190
+ samples = JFKReader.new(AUDIO)
191
+ @whisper.full_parallel(@params, samples, nil, Etc.nprocessors)
192
+
193
+ assert_equal Etc.nprocessors, @whisper.full_n_segments
194
+ text = @whisper.each_segment.collect(&:text).join
195
+ assert_match /ask what you can do/i, text
196
+ assert_match /for your country/i, text
197
+ end
198
+
199
+ def test_full_parallel_without_length_and_n_processors
200
+ @whisper.full_parallel(@params, @samples)
201
+
202
+ assert_equal 1, @whisper.full_n_segments
203
+ text = @whisper.each_segment.collect(&:text).join
204
+ assert_match /ask what you can do/i, text
205
+ assert_match /for your country/i, text
206
+ end
207
+
208
+ def test_full_parallel_without_length
209
+ @whisper.full_parallel(@params, @samples, nil, Etc.nprocessors)
210
+
211
+ assert_equal Etc.nprocessors, @whisper.full_n_segments
212
+ text = @whisper.each_segment.collect(&:text).join
213
+ assert_match /ask what you can do/i, text
214
+ assert_match /for your country/i, text
215
+ end
216
+
217
+ def test_full_parallel_without_n_processors
218
+ @whisper.full_parallel(@params, @samples, @samples.length)
219
+
220
+ assert_equal 1, @whisper.full_n_segments
221
+ text = @whisper.each_segment.collect(&:text).join
222
+ assert_match /ask what you can do/i, text
223
+ assert_match /for your country/i, text
224
+ end
225
+ end
138
226
  end
@@ -0,0 +1,36 @@
1
+ require_relative "extsources"
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = "whispercpp"
5
+ s.authors = ["Georgi Gerganov", "Todd A. Fisher"]
6
+ s.version = '1.3.1'
7
+ s.date = '2024-12-19'
8
+ s.description = %q{High-performance inference of OpenAI's Whisper automatic speech recognition (ASR) model via Ruby}
9
+ s.email = 'todd.fisher@gmail.com'
10
+ s.extra_rdoc_files = ['LICENSE', 'README.md']
11
+
12
+ s.files = `git ls-files . -z`.split("\x0") +
13
+ EXTSOURCES.collect {|file|
14
+ basename = File.basename(file)
15
+ if s.extra_rdoc_files.include?(basename)
16
+ basename
17
+ else
18
+ file.sub("../..", "ext")
19
+ end
20
+ }
21
+
22
+ s.summary = %q{Ruby whisper.cpp bindings}
23
+ s.test_files = s.files.select {|file| file.start_with? "tests/"}
24
+
25
+ s.extensions << 'ext/extconf.rb'
26
+ s.required_ruby_version = '>= 3.1.0'
27
+
28
+ #### Documentation and testing.
29
+ s.homepage = 'https://github.com/ggerganov/whisper.cpp'
30
+ s.rdoc_options = ['--main', 'README.md']
31
+
32
+
33
+ s.platform = Gem::Platform::RUBY
34
+
35
+ s.licenses = ['MIT']
36
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whispercpp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Georgi Gerganov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-05-14 00:00:00.000000000 Z
12
+ date: 2024-12-19 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: High-performance inference of OpenAI's Whisper automatic speech recognition
15
15
  (ASR) model via Ruby
@@ -21,18 +21,135 @@ extra_rdoc_files:
21
21
  - LICENSE
22
22
  - README.md
23
23
  files:
24
+ - ".gitignore"
24
25
  - LICENSE
25
26
  - README.md
26
27
  - Rakefile
27
- - ext/dr_wav.h
28
+ - ext/.gitignore
29
+ - ext/cpu.mk
30
+ - ext/examples/dr_wav.h
28
31
  - ext/extconf.rb
29
- - ext/ggml.c
30
- - ext/ggml.h
32
+ - ext/ggml/include/ggml-alloc.h
33
+ - ext/ggml/include/ggml-backend.h
34
+ - ext/ggml/include/ggml-blas.h
35
+ - ext/ggml/include/ggml-cann.h
36
+ - ext/ggml/include/ggml-cpp.h
37
+ - ext/ggml/include/ggml-cpu.h
38
+ - ext/ggml/include/ggml-cuda.h
39
+ - ext/ggml/include/ggml-kompute.h
40
+ - ext/ggml/include/ggml-metal.h
41
+ - ext/ggml/include/ggml-opencl.h
42
+ - ext/ggml/include/ggml-opt.h
43
+ - ext/ggml/include/ggml-rpc.h
44
+ - ext/ggml/include/ggml-sycl.h
45
+ - ext/ggml/include/ggml-vulkan.h
46
+ - ext/ggml/include/ggml.h
47
+ - ext/ggml/src/ggml-alloc.c
48
+ - ext/ggml/src/ggml-amx/common.h
49
+ - ext/ggml/src/ggml-amx/ggml-amx.cpp
50
+ - ext/ggml/src/ggml-amx/mmq.cpp
51
+ - ext/ggml/src/ggml-amx/mmq.h
52
+ - ext/ggml/src/ggml-backend-impl.h
53
+ - ext/ggml/src/ggml-backend-reg.cpp
54
+ - ext/ggml/src/ggml-backend.cpp
55
+ - ext/ggml/src/ggml-blas/ggml-blas.cpp
56
+ - ext/ggml/src/ggml-cann/acl_tensor.cpp
57
+ - ext/ggml/src/ggml-cann/acl_tensor.h
58
+ - ext/ggml/src/ggml-cann/aclnn_ops.cpp
59
+ - ext/ggml/src/ggml-cann/aclnn_ops.h
60
+ - ext/ggml/src/ggml-cann/common.h
61
+ - ext/ggml/src/ggml-cann/ggml-cann.cpp
62
+ - ext/ggml/src/ggml-cann/kernels/ascendc_kernels.h
63
+ - ext/ggml/src/ggml-cann/kernels/dup.cpp
64
+ - ext/ggml/src/ggml-cann/kernels/get_row_f16.cpp
65
+ - ext/ggml/src/ggml-cann/kernels/get_row_f32.cpp
66
+ - ext/ggml/src/ggml-cann/kernels/get_row_q4_0.cpp
67
+ - ext/ggml/src/ggml-cann/kernels/get_row_q8_0.cpp
68
+ - ext/ggml/src/ggml-cann/kernels/quantize_f16_q8_0.cpp
69
+ - ext/ggml/src/ggml-cann/kernels/quantize_f32_q8_0.cpp
70
+ - ext/ggml/src/ggml-cann/kernels/quantize_float_to_q4_0.cpp
71
+ - ext/ggml/src/ggml-common.h
72
+ - ext/ggml/src/ggml-cpu/amx/amx.cpp
73
+ - ext/ggml/src/ggml-cpu/amx/amx.h
74
+ - ext/ggml/src/ggml-cpu/amx/common.h
75
+ - ext/ggml/src/ggml-cpu/amx/mmq.cpp
76
+ - ext/ggml/src/ggml-cpu/amx/mmq.h
77
+ - ext/ggml/src/ggml-cpu/cpu-feats-x86.cpp
78
+ - ext/ggml/src/ggml-cpu/ggml-cpu-aarch64.cpp
79
+ - ext/ggml/src/ggml-cpu/ggml-cpu-aarch64.h
80
+ - ext/ggml/src/ggml-cpu/ggml-cpu-hbm.cpp
81
+ - ext/ggml/src/ggml-cpu/ggml-cpu-hbm.h
82
+ - ext/ggml/src/ggml-cpu/ggml-cpu-impl.h
83
+ - ext/ggml/src/ggml-cpu/ggml-cpu-quants.c
84
+ - ext/ggml/src/ggml-cpu/ggml-cpu-quants.h
85
+ - ext/ggml/src/ggml-cpu/ggml-cpu-traits.cpp
86
+ - ext/ggml/src/ggml-cpu/ggml-cpu-traits.h
87
+ - ext/ggml/src/ggml-cpu/ggml-cpu.c
88
+ - ext/ggml/src/ggml-cpu/ggml-cpu.cpp
89
+ - ext/ggml/src/ggml-cpu/llamafile/sgemm.cpp
90
+ - ext/ggml/src/ggml-cpu/llamafile/sgemm.h
91
+ - ext/ggml/src/ggml-cuda/vendors/cuda.h
92
+ - ext/ggml/src/ggml-cuda/vendors/hip.h
93
+ - ext/ggml/src/ggml-cuda/vendors/musa.h
94
+ - ext/ggml/src/ggml-impl.h
95
+ - ext/ggml/src/ggml-kompute/ggml-kompute.cpp
96
+ - ext/ggml/src/ggml-metal/ggml-metal-impl.h
97
+ - ext/ggml/src/ggml-metal/ggml-metal.m
98
+ - ext/ggml/src/ggml-metal/ggml-metal.metal
99
+ - ext/ggml/src/ggml-opt.cpp
100
+ - ext/ggml/src/ggml-quants.c
101
+ - ext/ggml/src/ggml-quants.h
102
+ - ext/ggml/src/ggml-rpc/ggml-rpc.cpp
103
+ - ext/ggml/src/ggml-sycl/common.cpp
104
+ - ext/ggml/src/ggml-sycl/concat.cpp
105
+ - ext/ggml/src/ggml-sycl/conv.cpp
106
+ - ext/ggml/src/ggml-sycl/convert.cpp
107
+ - ext/ggml/src/ggml-sycl/dmmv.cpp
108
+ - ext/ggml/src/ggml-sycl/element_wise.cpp
109
+ - ext/ggml/src/ggml-sycl/ggml-sycl.cpp
110
+ - ext/ggml/src/ggml-sycl/im2col.cpp
111
+ - ext/ggml/src/ggml-sycl/mmq.cpp
112
+ - ext/ggml/src/ggml-sycl/mmvq.cpp
113
+ - ext/ggml/src/ggml-sycl/norm.cpp
114
+ - ext/ggml/src/ggml-sycl/outprod.cpp
115
+ - ext/ggml/src/ggml-sycl/rope.cpp
116
+ - ext/ggml/src/ggml-sycl/softmax.cpp
117
+ - ext/ggml/src/ggml-sycl/tsembd.cpp
118
+ - ext/ggml/src/ggml-sycl/wkv6.cpp
119
+ - ext/ggml/src/ggml-threading.cpp
120
+ - ext/ggml/src/ggml-threading.h
121
+ - ext/ggml/src/ggml-vulkan/ggml-vulkan.cpp
122
+ - ext/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp
123
+ - ext/ggml/src/ggml.c
124
+ - ext/include/whisper.h
125
+ - ext/metal-embed.mk
126
+ - ext/metal.mk
31
127
  - ext/ruby_whisper.cpp
32
128
  - ext/ruby_whisper.h
33
- - ext/whisper.cpp
34
- - ext/whisper.h
129
+ - ext/scripts/get-flags.mk
130
+ - ext/src/coreml/whisper-decoder-impl.h
131
+ - ext/src/coreml/whisper-decoder-impl.m
132
+ - ext/src/coreml/whisper-encoder-impl.h
133
+ - ext/src/coreml/whisper-encoder-impl.m
134
+ - ext/src/coreml/whisper-encoder.h
135
+ - ext/src/openvino/whisper-openvino-encoder.cpp
136
+ - ext/src/openvino/whisper-openvino-encoder.h
137
+ - ext/src/whisper.cpp
138
+ - extsources.rb
139
+ - lib/whisper.rb
140
+ - lib/whisper/model/uri.rb
141
+ - tests/helper.rb
142
+ - tests/jfk_reader/.gitignore
143
+ - tests/jfk_reader/extconf.rb
144
+ - tests/jfk_reader/jfk_reader.c
145
+ - tests/test_callback.rb
146
+ - tests/test_error.rb
147
+ - tests/test_model.rb
148
+ - tests/test_package.rb
149
+ - tests/test_params.rb
150
+ - tests/test_segment.rb
35
151
  - tests/test_whisper.rb
152
+ - whispercpp.gemspec
36
153
  homepage: https://github.com/ggerganov/whisper.cpp
37
154
  licenses:
38
155
  - MIT
@@ -40,24 +157,33 @@ metadata: {}
40
157
  post_install_message:
41
158
  rdoc_options:
42
159
  - "--main"
43
- - "../../README.md"
160
+ - README.md
44
161
  require_paths:
45
162
  - lib
46
- - ext
47
163
  required_ruby_version: !ruby/object:Gem::Requirement
48
164
  requirements:
49
165
  - - ">="
50
166
  - !ruby/object:Gem::Version
51
- version: '0'
167
+ version: 3.1.0
52
168
  required_rubygems_version: !ruby/object:Gem::Requirement
53
169
  requirements:
54
170
  - - ">="
55
171
  - !ruby/object:Gem::Version
56
172
  version: '0'
57
173
  requirements: []
58
- rubygems_version: 3.5.9
174
+ rubygems_version: 3.5.22
59
175
  signing_key:
60
176
  specification_version: 4
61
177
  summary: Ruby whisper.cpp bindings
62
178
  test_files:
179
+ - tests/helper.rb
180
+ - tests/jfk_reader/.gitignore
181
+ - tests/jfk_reader/extconf.rb
182
+ - tests/jfk_reader/jfk_reader.c
183
+ - tests/test_callback.rb
184
+ - tests/test_error.rb
185
+ - tests/test_model.rb
186
+ - tests/test_package.rb
187
+ - tests/test_params.rb
188
+ - tests/test_segment.rb
63
189
  - tests/test_whisper.rb