Usually a "code for the O2 sensors" does not mean that the sensors are bad. The sensors are simply reporting that a condition outside the parameters of the sensor is detected.
If the sensor is seeing a lean condition for an extended length of time, the PCM will set a code for the sensor out of range, or a similar message. This could be caused by a clogged fuel filter, a weak fuel pump (as I've seen many times, or a contaminated MAF.
I normally disconnect the MAF and then run the engine. If the MAF is contaminated it will falsely detect less air flow than is really going into the engine. Less air means teh PCM cuts back on the fuel. This causes a lean condition setting off CEL for an O2 that is out of range, and usually later another CEL for the MAF out of range. The low voltage is simply another way of saying out of range.
If running the engine with the MAF disconnected improves the running, and a CEL for a lean condition does not return (after clearing the codes before restart) the MAF is the cause of the problem. I've had about a 50/50 success rate with cleaning contaminated MAFs. If you are running an oiled air filter I'd change to a non-oil long life filter.
Did you replace the MAF with a used or new one?
Another thing, if the CAT is clogged it will result in less air flow through the engine resulting in a CEL for low flow through the MAF. A lower flow through the MAF causes a lean condition which also can cause the O2s to report a lean condition. Easy to confirm a clogged CAT. Remove the O2 ahead of the CAT, just unscrew it and tie it up put of the way. Drive it, it will be noisy, but it will now drive smooth and have power. Usually with a clogged CAT, the RPM will top out like it has a governor, usually around 2500-3000 RPM, it will fall flat on its face.
Some things to check.
I was planning on procrastinating today but I think I'll do that tomorrow.