In the present timeline, Rohit (Jishu Sengupta), a Gujrati born and brought up in Calcutta, falls in love with Mahamaya (Swastika Mukherjee) and tries to woo her. Since he can just barely utter a few bengali words (and that too in the wrong places), Mahamaya throws him a hurdle to cross - if he can write a song with correct bengali lyrics and sing it without any accent or mistake, she would think of a possible relationship. Rohit accepts the challenge and goes to Portugal to study colonial history.
Two years pass. Mahamaya is now a radio jockey at a popular radio station. Rohit is in Portugal but still very much in love with her. His bengali is being refined by his friend and classmate Bodhi (Abir Chatterjee). Rohit chooses the music course and decides to do it on the 19th Century folk poet Heynsman Anthony. He goes to Calcutta and then to Farashdanga, Chandannagar, where Anthony lived and composed his songs. He goes to the local library to get some books where he meets the assistant librarian, a mysterious man named Kushawl Hajra (Prosenjit Chatterjee), who claims to be the re-incarnation of Anthony himself. Kushawl laments that the visions of his previous life is haunting him every day, and slowly taking over the memory of his present life. Rohit promises to take him to Calcutta for treatment, in return he demands the life history of Anthony.
The story then goes back to the 19th Century, where Anthony impresses the villagers with his musical talent. He saves a young bengali widow, Soudamini, from performing sati and later marries her. But he yearns to learn the bengali language and compose songs in that language. He learns it, reading Hindu scriptures and understanding the meaning of the folk compositions. In those days, kavigaans were very popular in Calcutta, where two kaviyaals or folk poets would face each other with their respective groups and compete with each other through songs and poems. Anthony was impressed by the kavigaans and decided to form a group on his own. He used to compose the songs himself, and on the first occasion met the woman kaviyaal, Joggeshwari (Ananya Chatterjee), whom he defeats. Slowly, as he began to progress in his career as a kaviyaal, he competed with noted kaviyaals of the time like Ram Basu (Sujan Mukherjee) and Thakur Singh (Biswajit Chakraborty).
Simultaneously, in the present timeline, Kushawl is taken to a psychiatrist, where he is informed that to stop the visions, he must complete a work which he could not possibly do as Anthony. Kushawl's visions get stronger and stronger. Rohit meanwhile has found a way to sing his latest bengali composition in front of Mahamaya, whose radio company has decided to organize a competition among bands hailing both from West Bengal and Bangladesh, "Bandemonium". Bodhi, who meanwhile had come to Calcutta to meet Rohit, takes him to Sidhu (playing himself) to arrange musicians for Rohit's performance. Meanwhile, Mahamaya had also started developing feelings for Rohit.
Kushawl reveals to Rohit the story of Anthony's last kavigaan. Anthony had been planning to do a Durga-puja all by himself. But the villagers were against this, as, to them, Anthony is a firingee (foreigner) who has no right to perform a Hindu puja. He tells Soudamini that he is going to Calcutta for another kavigaan, and so won't be staying during the days of the puja. As planned, he leaves for Calcutta on the day of the puja. This time, his competition is with the best kaviyaal, Bhola Moira (Kharaj Mukherjee). The competition heightens and Anthony wins after a tough fight.
In the present timeline, the day of "Bandemonium" has arrived. Rohit goes on stage and performs his bengali song E Tumi Kemon Tumi as Mahamaya looks on, tears in her eyes. Within the song, the film goes back to the 19th Century. After Anthony returned from Calcutta, victorious against Bhola Moira, he finds his house and his durga idol set on fire by the villagers. He finds Soudamini dead and nobody around. With his love killed and his faith shattered, he digs a grave for her, and then for himself (as he had once promised jokingly to his wife).
During the show, Bodhi brings Kushawl to the auditorium to see the performance of Rohit. Kushawl meets Mahamaya, and then leaves abruptly. After the performance, Rohit and Mahamaya profess their love for each other backstage. Rohit suddenly is informed that Kushawl is missing. He, along with Mahamaya, goes to Kushawl's house in Chandannagar, where they find him completely insane and lost in his visions. He attacks Rohit and then blabbers rubbish. Rohit, heartbroken, leaves with Mahamaya, realising that Kushawl is beyond cure now. The film then ends with a master twist, revealing Mahamaya as the reincarnation of Soudamini, though she remembers nothing of her previous birth. Anthony had wanted to apologize to his wife for leaving her alone, which Kushawl does after Mahamaya leaves with Rohit. The visions will not haunt him anymore. The film ends as Kabir Suman's song "Jaatishwar" plays in the background.