Views
No views yet
sanchit-gandhi/earnings22_split) with all rows from source
recordings that appear in the ESB/Open-ASR test sets excluded.transcribe.py adds a phrase-level repetition-loop collapse alongside the
existing word-repetition cap (implemented inline in transcribe.py;
ngram_loop_fix.py carries the standalone reference and tests). Both are
deterministic and applied uniformly to every dataset.trust_remote_code=True when loading.1import torch
2from transformers import AutoConfig, AutoModel, AutoTokenizer
3
4# Load model
5model = AutoModel.from_pretrained(
6 "bosonai/higgs-audio-v3-stt",
7 torch_dtype=torch.bfloat16,
8 trust_remote_code=True,
9 attn_implementation="eager",
10 device_map="cuda:0",
11)
12
13# Load tokenizer
14tokenizer = AutoTokenizer.from_pretrained("bosonai/higgs-audio-v3-stt")boson_multimodal library:1import torch
2import numpy as np
3from functools import partial
4from dataclasses import asdict
5from transformers import AutoConfig, AutoModel, AutoTokenizer, WhisperProcessor
6
7# Load model
8config = AutoConfig.from_pretrained("bosonai/higgs-audio-v3-stt", trust_remote_code=True)
9model = AutoModel.from_pretrained(
10 "bosonai/higgs-audio-v3-stt",
11 torch_dtype=torch.bfloat16,
12 trust_remote_code=True,
13 attn_implementation="eager",
14 device_map="cuda:0",
15)
16model.eval()
17tokenizer = AutoTokenizer.from_pretrained("bosonai/higgs-audio-v3-stt")
18model.audio_out_bos_token_id = tokenizer.convert_tokens_to_ids("<|audio_out_bos|>")
19model.audio_eos_token_id = tokenizer.convert_tokens_to_ids("<|audio_eos|>")
20
21# Audio collator setup
22from boson_multimodal.data_collator.higgs_audio_collator import HiggsAudioSampleCollator
23from boson_multimodal.data_types import ChatMLSample, AudioContent, Message
24from boson_multimodal.dataset.chatml_dataset import ChatMLDatasetSample, prepare_chatml_sample_qwen
25
26whisper_proc = WhisperProcessor.from_pretrained("openai/whisper-large-v3")
27collator = HiggsAudioSampleCollator(
28 whisper_processor=whisper_proc,
29 audio_in_token_id=config.audio_in_token_idx,
30 audio_out_token_id=config.audio_out_token_idx,
31 audio_stream_bos_id=config.audio_stream_bos_id,
32 audio_stream_eos_id=config.audio_stream_eos_id,
33 encode_whisper_embed=config.encode_whisper_embed,
34 pad_token_id=config.pad_token_id,
35 return_audio_in_tokens=config.encode_audio_in_tokens,
36 use_delay_pattern=config.use_delay_pattern,
37 round_to=1,
38 audio_num_codebooks=config.audio_num_codebooks,
39 chunk_size_seconds=getattr(config, "chunk_size_seconds", 30),
40 encoder_padding_method=getattr(config, "encoder_padding_method", "max_length"),
41)
42
43# Transcribe
44import soundfile as sf
45
46audio_np, sr = sf.read("audio.wav") # must be 16kHz mono
47if sr != 16000:
48 import librosa
49 audio_np = librosa.resample(audio_np, orig_sr=sr, target_sr=16000)
50
51prompt = "Transcribe the speech. Output only the spoken words in lowercase with no punctuation."
52messages = [Message(role="user", content=[prompt, AudioContent(audio_url="placeholder")])]
53chatml = ChatMLSample(messages=messages)
54prep_fn = partial(prepare_chatml_sample_qwen, enable_thinking=True)
55input_tokens, _, _, _ = prep_fn(chatml, tokenizer, add_generation_prompt=True)
56
57sample = ChatMLDatasetSample(
58 input_ids=torch.LongTensor(input_tokens),
59 label_ids=None,
60 audio_ids_concat=None,
61 audio_ids_start=None,
62 audio_waveforms_concat=torch.tensor(audio_np, dtype=torch.float32),
63 audio_waveforms_start=torch.tensor([0]),
64 audio_sample_rate=torch.tensor([16000]),
65 audio_speaker_indices=torch.tensor([0]),
66)
67
68batch = asdict(collator([sample]))
69device = next(model.parameters()).device
70batch = {k: v.to(device).contiguous() if isinstance(v, torch.Tensor) else v for k, v in batch.items()}
71
72with torch.inference_mode():
73 outputs = model.generate(**batch, max_new_tokens=1024, use_cache=True, do_sample=False,
74 stop_strings=["<|im_end|>", "<|endoftext|>"], tokenizer=tokenizer)
75
76output_ids = outputs[0] if isinstance(outputs, tuple) else outputs
77full_text = tokenizer.decode(output_ids[0], skip_special_tokens=False)
78
79# Extract transcription (remove thinking block and special tokens)
80import re
81parts = full_text.split("assistant\n")
82hyp = parts[-1] if len(parts) > 1 else full_text
83hyp = re.sub(r"<think>.*?</think>", "", hyp, flags=re.DOTALL)
84hyp = re.sub(r"<\|.*?\|>", "", hyp).strip()
85print(hyp)
86
87# For the exact pipeline used in our evaluations (including the
88# deterministic repetition/loop post-processing), use transcribe.py
89# bundled in this repo: transcribe() / transcribe_batch().torch
transformers>=4.51.0
boson_multimodal # for audio preprocessing