Skip to content

Commit 5243d78

Browse files
committed
Fix encoding g722 format
g722 format only supports 16k Hz, but AVCodec does not list this. The implementation does not insert resampling and the resulting audio can be slowed down or sped up.
1 parent c6624fa commit 5243d78

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

test/torchaudio_unittest/io/stream_writer_test.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,22 @@ def test_audio_num_frames_lossy(self, ext, num_channels, sample_rate):
389389
return
390390
self.assertEqual(saved.shape, data.shape)
391391

392+
def test_g722_sample_rate(self):
393+
"""Encoding G.722 properly converts sample rate to 16k"""
394+
filename = "test.g722"
395+
sample_rate = 41000
396+
data = get_sinusoid(sample_rate=sample_rate, n_channels=1, channels_first=False)
397+
398+
# write data
399+
dst = self.get_temp_path(filename)
400+
w = StreamWriter(dst, format="g722")
401+
w.add_audio_stream(sample_rate=sample_rate, num_channels=1)
402+
with w.open():
403+
w.write_audio_chunk(0, data)
404+
405+
r = StreamReader(src=self.get_temp_path(filename))
406+
self.assertEqual(r.get_src_stream_info(0).sample_rate, 16000)
407+
392408
def test_preserve_fps(self):
393409
"""Decimal point frame rate is properly saved
394410

torchaudio/csrc/ffmpeg/stream_writer/encode_process.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,20 @@ int get_enc_sr(
273273
int src_sample_rate,
274274
const c10::optional<int>& encoder_sample_rate,
275275
const AVCodec* codec) {
276+
// G.722 only supports 16000 Hz, but it does not list the sample rate in
277+
// supported_samplerates so we hard code it here.
278+
if (codec->id == AV_CODEC_ID_ADPCM_G722) {
279+
if (encoder_sample_rate) {
280+
auto val = encoder_sample_rate.value();
281+
TORCH_CHECK(
282+
val == 16'000,
283+
codec->name,
284+
" does not support sample rate ",
285+
val,
286+
". Supported values are; 16000.");
287+
}
288+
return 16'000;
289+
}
276290
if (encoder_sample_rate) {
277291
const int& encoder_sr = encoder_sample_rate.value();
278292
TORCH_CHECK(

0 commit comments

Comments
 (0)