Faits: Faits: A. Par acte du 10 août 1999, complété le 2 novembre 1999, B.A._ a déposé une plainte pénale contre son mari, A.A._, pour violation d'une obligation d'entretien; elle lui reprochait de ne pas avoir versé l'intégralité des sommes qu'il devait verser pour l'entretien de sa famille en vertu de l'ordonnance sur mesures provisionnelles rendue le 16 juillet 1999 par le Président du Tribunal civil de l'arrondissement de la Singine dans le cadre de la procédure en divorce ou en séparation de corps engagée contre lui. Par ordonnance du 4 octobre 2000, le Juge d'instruction du canton de Fribourg a renvoyé A.A._ en jugement devant le Tribunal pénal de l'arrondissement de la Singine. A l'issue d'une séance tenue le 22 mars 2001, la procédure pénale a été suspendue d'entente entre les parties pour une durée indéterminée, afin de permettre l'engagement de pourparlers en vue d'un éventuel retrait de plainte. La plaignante a requis la reprise de la procédure en date du 5 juillet 2001. Le Tribunal pénal de l'arrondissement de la Singine a statué le 19 mars 2002. Il a rejeté la demande de l'accusé à être assisté d'un interprète, présentée en début d'audience, qu'il a tenue pour tardive et infondée, le président de cette juridiction assurant la traduction dans la mesure nécessaire. Sur le fond, il a reconnu A.A._ coupable de violation d'une obligation d'entretien et l'a condamné à une peine complémentaire d'un mois d'emprisonnement, avec sursis pendant deux ans. Donnant suite aux conclusions civiles de la plaignante, il l'a astreint à verser à cette dernière un montant de 1'000 fr. pour ses frais d'intervention au procès, ainsi que pour les honoraires de son avocat dans la procédure pénale. A.A._ a recouru contre ce jugement auprès de la Cour d'appel pénal du Tribunal cantonal du canton de Fribourg (ci-après: la Cour d'appel pénal ou la cour cantonale); il prétendait ne pas avoir bénéficié d'un procès équitable dès lors que les débats avaient été menés en allemand, voire en suisse allemand, langues qu'il ne comprenait pas, après que sa demande tendant à l'assistance d'un interprète eut été écartée; il contestait au surplus la qualité de la traduction faite par le Président du Tribunal pénal de l'arrondissement de la Singine et se plaignait d'une fausse application du droit pénal fédéral. Statuant par arrêt du 20 mai 2003, la Cour d'appel pénal a rejeté le recours et confirmé le jugement rendu le 19 mars 2002 par le Tribunal pénal de l'arrondissement de la Singine. Elle a retenu en substance que A.A._ avait agi tardivement en requérant l'assistance d'un interprète au début de l'audience de jugement et que la demande pouvait être écartée pour ce seul motif. Elle a en outre estimé, au vu de l'ensemble des circonstances, que les droits de la défense n'avaient pas été violés et que l'accusé avait bénéficié d'un procès équitable. Enfin, elle a considéré l'appel comme matériellement infondé et a confirmé la condamnation prononcée en première instance. Statuant par arrêt du 20 mai 2003, la Cour d'appel pénal a rejeté le recours et confirmé le jugement rendu le 19 mars 2002 par le Tribunal pénal de l'arrondissement de la Singine. Elle a retenu en substance que A.A._ avait agi tardivement en requérant l'assistance d'un interprète au début de l'audience de jugement et que la demande pouvait être écartée pour ce seul motif. Elle a en outre estimé, au vu de l'ensemble des circonstances, que les droits de la défense n'avaient pas été violés et que l'accusé avait bénéficié d'un procès équitable. Enfin, elle a considéré l'appel comme matériellement infondé et a confirmé la condamnation prononcée en première instance. B. Agissant par la voie du recours de droit public, A.A._ demande au Tribunal fédéral d'annuler cet arrêt. Il dénonce une violation des art. 50, 51 et 56 al. 3 du Code de procédure pénale du canton de Fribourg (CPP frib.) et de son droit à un procès équitable garanti à l'art. 6 § 1 CEDH. La Cour d'appel pénal et le Ministère public du canton de Fribourg ont renoncé à déposer des observations. B.A._ conclut au rejet du recours.