The bus crossed a railway track at an unmanned crossing in Telangana state without stopping to check if the way was clear, said Indian Railways spokesman Anil Kumar Saxena.
Police said the bus was carrying 32 children, 12 of whom died on the spot. Seven more died in a nearby hospital, where others are in critical condition.
"Doctors say blood is flowing from their bodies," said a police official who declined to be identified, as he was not authorised to speak to the media. He put the tally of deaths at 20, including the bus driver.
Road and rail accidents are common in India, where rickety infrastructure and weak law enforcement struggle to cope with a surge in traffic and floods of unlicensed drivers.
More than 230,000 people were killed on Indian roads in 2010.