"I have been under the weather for awhile, so I really didn't know what I was going to have out there," said Arroyo, who has dealt with allergies and colds since spring training. "But that was probably the best stuff I have had all year. Especially the fastball. I had good command of my other pitches."
Arroyo (1-2) allowed six hits and two runs with seven strikeouts to bounce back from his last start, when he allowed eight runs in three-plus innings.
Cincinnati has its longest winning streak of the season. Houston has lost three straight.
Votto's first-pitch shot to the Crawford Boxes in left field scored Drew Stubbs and pushed the lead to 3-1 in the seventh inning.
Roy Oswalt (2-3) gave up eight hits and three runs while striking out seven in seven innings in his first start since returning from Mississippi where he helped his parents clean up after their home was destroyed in a tornado on Saturday.
"I felt pretty well," he said. "It's been a long week but seven innings kept us in the ballgame."
Oswalt had won his last eight decisions. His second career loss to the Reds still leaves him at 23-2 against them.
"Bronson gave us all he had," Reds manager Dusty Baker said. "Oswalt was Oswalt, but Bronson just got the better of him tonight. You figured we'd get him sooner or later. The odds were in our favor big time with the law of averages. I figured Bronson was going to win one, he was 0-2. That and we never seem to beat Oswalt."
Astros manager Brad Mills was impressed with Oswalt's effort Thursday night and in each of his other four starts this year.
"He's done a great job, we just haven't been able to get him the runs we'd like to get him," Houston manager Brad Mills said. "He's pitched five quality starts and done a great job."
Francisco Cordero allowed one hit in a scoreless ninth for his eighth save.
"I made a really bad pitch to Pence," Arroyo said. "I had him 0-1 and I threw a soft breaking ball that was supposed to be off the plate, and I left it on. I felt like I was tiring a little bit there. Like I said, I have been under the weather a little bit."
After Carlos Lee singled with two outs in the third inning, Arroyo retired the next seven batters. He didn't allow another hit until Kaz Matsui's single in the sixth inning.
Oswalt got his 1,500th career strikeout when he retired Arroyo to end the inning. He's the second player in franchise history to reach the mark, joining Nolan Ryan, who had 1,866 with the team. ... Houston LHP Wandy Rodriguez will miss his scheduled start on Friday at Atlanta because of back spasms. Brett Myers will replace him and the Astros are optimistic that Rodriguez can pitch on Saturday. ... Cincinnati CF Chris Dickerson sprained his right wrist in the second inning Thursday night and will have an MRI on Friday. "It had been bothering him, and he hadn't been playing much," Baker said. "Then we thought we got it fixed. But he took a swing tonight, and it came back. We'll know (Friday). It's safe to say he won't be available for a few days."