{"record":{"id":"ee16d7aa7b738408","repo":"unslothai/unsloth","slug":"bicodec-dataset-needs-audio-and-text-columns","errorCode":null,"errorMessage":"BiCodec dataset needs 'audio' and 'text' columns, got: {dataset.column_names}","messagePattern":"BiCodec dataset needs 'audio' and 'text' columns, got: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"studio/backend/core/training/trainer.py","lineNumber":2065,"sourceCode":"        self._update_progress(status_message = \"Preparing Spark-TTS codec source...\")\n        spark_code_dir = ensure_spark_tts_source(self._spark_tts_repo_dir)\n        self._spark_tts_code_dir = spark_code_dir\n        BiCodecTokenizer = import_sparktts_module(\n            \"sparktts.models.audio_tokenizer\",\n            spark_code_dir,\n        ).BiCodecTokenizer\n        audio_volume_normalize = import_sparktts_module(\n            \"sparktts.utils.audio\",\n            spark_code_dir,\n        ).audio_volume_normalize\n\n        resolved = self._resolve_audio_columns(dataset, custom_format_mapping)\n        audio_col = resolved[\"audio_col\"]\n        text_col = resolved[\"text_col\"]\n        speaker_col = resolved[\"speaker_col\"]\n        has_source = speaker_col is not None\n        if not audio_col or not text_col:\n            raise ValueError(\n                f\"BiCodec dataset needs 'audio' and 'text' columns, got: {dataset.column_names}\"\n            )\n\n        # Cast so datasets 4.x AudioDecoder objects decode to dicts. No resample here --\n        # BiCodec's target_sr may differ; the loop does it.\n        from datasets import Audio\n\n        dataset = dataset.cast_column(audio_col, Audio())\n\n        self._update_progress(status_message = \"Loading BiCodec tokenizer...\")\n        logger.info(\"Loading BiCodec tokenizer...\\n\")\n        audio_tokenizer = BiCodecTokenizer(self._spark_tts_repo_dir, device)\n\n        target_sr = audio_tokenizer.config[\"sample_rate\"]\n\n        self._update_progress(status_message = \"Encoding audio with BiCodec...\")\n        logger.info(\n            f\"BiCodec preprocessing: audio_col='{audio_col}', text_col='{text_col}', \"","sourceCodeStart":2047,"sourceCodeEnd":2083,"githubUrl":"https://github.com/unslothai/unsloth/blob/203007d19051dcd2ae33876786d117c99f6b0368/studio/backend/core/training/trainer.py#L2047-L2083","documentation":"ValueError raised at the start of BiCodec (Spark-TTS) preprocessing when column resolution finds no audio or no text column. Speaker column is optional, but audio and text are mandatory: audio is cast with Audio() for datasets 4.x decoding, then encoded with the BiCodecTokenizer. Missing either column aborts before the tokenizer is loaded.","triggerScenarios":"Spark-TTS fine-tune with a dataset lacking a text column, lacking audio, or having them under names not recognized by _resolve_audio_columns or provided in custom_format_mapping.","commonSituations":"Column names like 'speech'/'sentence' unmapped; dataset prepared for a different TTS pipeline; wrong model type routes a non-audio dataset into BiCodec preprocessing.","solutions":["Supply custom_format_mapping mapping your names to 'audio' and 'text'.","Rename the columns to conventional audio/text names.","Verify the dataset actually contains audio plus transcripts for Spark-TTS training."],"exampleFix":"// before\ndataset  # columns: ['speech', 'sentence']\n// after\ndataset = dataset.rename_column('speech', 'audio').rename_column('sentence', 'text')","handlingStrategy":"validation","validationCode":"def bicodec_ready(dataset) -> bool:\n    return 'audio' in dataset.column_names and 'text' in dataset.column_names\n\nassert bicodec_ready(dataset), \"BiCodec needs 'audio' and 'text' columns\"","typeGuard":"def is_bicodec_dataset(dataset) -> bool:\n    return 'audio' in dataset.column_names and 'text' in dataset.column_names","tryCatchPattern":"try:\n    ds = trainer._preprocess_bicodec_dataset(dataset, mapping)\nexcept ValueError as e:\n    if \"BiCodec dataset needs\" in str(e):\n        dataset = dataset.rename_column('speech', 'audio').rename_column('sentence', 'text')\n        ds = trainer._preprocess_bicodec_dataset(dataset, mapping)","preventionTips":["Prepare Spark-TTS datasets with 'audio' and 'text' columns from the start.","Supply custom_format_mapping for legacy column names rather than patching the trainer.","Validate the schema before BiCodecTokenizer load to save GPU time."],"tags":["audio","bicodec","tts","dataset","validation"],"backgroundTag":null,"analyzedSha":"203007d19051dcd2ae33876786d117c99f6b0368","analyzedAt":"2026-08-15T02:48:39.846Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}