About 10 people were being held, Ukraine’s Security Service said in a Facebook statement.
Police had earlier put the number at 20. It was unclear how many people had been on board to start with, and whether any escaped.
Officers sealed off the centre of Lutsk, a city 250 miles west of the capital Kyiv.
The assailant is armed and carrying explosives, police said. He has refused the authorities’ offer to deliver water and food to the hostages.
At one point, he threw explosives out of a bus window, but no one was hurt. He also fired several shots at a police drone.
President Volodymyr Zelenskiy said negotiations with the man are under way, adding: “We’re doing everything to free the hostages.”
The man called police after taking control of the bus and introduced himself as Maksim Plokhoy, deputy interior minister Anton Gerashchenko said.
In a Telegram account reportedly belonging to him, Plokhoy apparently admitted taking people on the bus hostage, said “the state has always been and always is the first terrorist”, and demanded that senior Ukrainian officials release statements on their social media pages calling themselves terrorists.
According to Mr Gerashchenko, police have identified the man as Maksim Krivosh, a 44-year-old Ukrainian born in Russia. He had allegedly been convicted twice on a wide range of charges — robbery, fraud, illegal arms handling — and spent a total of 10 years behind bars.
Interior minister Arsen Avakov travelled to Lutsk to supervise operations.
Ukrainian media reported that gunshots were heard at the scene. It was not clear whether anyone has been injured.
According to reports, Krivosh tried to reach out to journalists through hostages and their phones, demanding they spread the word about his demands and get more reporters at the scene.
Mr Zelenskiy said earlier on Tuesday that he was personally monitoring the situation.